Skip to content

Spring Boot ​

Extension de Spring đŸŒ± qui simplifie la crĂ©ation d'applications Java ☕ autonomes et prĂȘtes Ă  l'emploi. Il Ă©limine la configuration complexe grĂące Ă  :

  • Convention Over Configuration ;
  • Un serveur embarquĂ© (Tomcat, Jetty) ;
  • Un systĂšme d'"Auto-Configuration" intelligent ;

Il suffit de l'annotation @SpringBootApplication pour démarrer un projet rapidement...

Spring đŸŒ± ​

Framework Open-Source pour le dĂ©veloppement d'applications Java ☕, axĂ© sur la crĂ©ation de systĂšmes flexibles, testables et facilement maintenable. Il repose sur des concepts clĂ©s comme l'Inversion of Control (IoC) et l'Injection de DĂ©pendances (DI) pour simplifier la gestion des composants. Spring đŸŒ± offre Ă©galement des modules pour la gestion des donnĂ©es (Spring Data), la sĂ©curitĂ© (Spring Security), et bien plus encore...

Bean ​

Un Bean est un objet géré par le Spring IoC Container. Il est instancié, configuré et géré par le conteneur tout au long de son cycle de vie à la maniÚre d'un Singleton (c'est-à-dire qu'une seule instance est créée pour tout le conteneur). Les Bean's sont créés à partir de classes annotées avec des stéréotypes (@interface) comme @Component, @Service, @Repository ou définis via @Bean dans une classe de configuration.

Cycle de Vie :

  1. Instantiation : Le conteneur crée une instance du Bean ;
  2. Injection des Dépendances : Les dépendances sont injectées (via @Autowired ou constructeur) ;
  3. Initialisation : La méthode annotée avec @PostConstruct est exécutée ;
  4. Utilisation : Le Bean est prĂȘt Ă  ĂȘtre utilisĂ© dans l'application ;
  5. Destruction : Avant sa suppression, la méthode annotée avec @PreDestroy est appelée ;

Inversion of Control ​

L'Inversion of Control (IoC) est un principe de conception oĂč le contrĂŽle de l'instanciation et de la gestion des dĂ©pendances est dĂ©lĂ©guĂ© Ă  un conteneur externe plutĂŽt qu'au code lui-mĂȘme.

java
class Engine {
    void start() {
        System.out.println("Starting...");
    }
}

class Robot {
    private Engine engine;

    public Robot() {
        this.engine = new Engine();
    }

    void run() {
        engine.start();
        System.out.println("Running...");
    }
}

public class Main {
    public static void main(String[] args) {
        Robot robot = new Robot();
        robot.run();
    }
}

❌ Sans Injection de DĂ©pendance : Couplage Fort !

java
class Engine {
    void start() {
        System.out.println("Starting...");
    }
}

class Robot {
    private final Engine engine;

    public Robot(Engine engine) {
        this.engine = engine;
    }

    void run() {
        engine.start();
        System.out.println("Running...");
    }
}

public class Main {
    public static void main(String[] args) {
        Engine engine = new Engine();
        Robot robot = new Robot(engine);
        robot.run();
    }
}

✅ Avec Injection de DĂ©pendance : Couplage Faible !

Annotations ⚙ ​

Spring Core ​

AnnotationDescription
@ConfigurationIndique qu'une classe contient des définitions de Bean's via des méthodes annotées @Bean
@BeanDĂ©clare un Bean manuel dans le contexte Spring đŸŒ± (souvent utilisĂ© dans les classes @Configuration)
@ComponentMarque une classe comme un Bean détectable automatiquement lors de la détection de composants (@ComponentScan)
@AutowiredEffectue l'Injection de DĂ©pendances automatique par le conteneur Spring đŸŒ±
@Qualifier("beanName")Spécifie quel Bean injecter lorsque plusieurs implémentations sont disponibles
@PostConstructMéthode exécutée aprÚs l'instanciation du Bean (utile pour l'initialisation de données)
@PreDestroyMéthode exécutée juste avant la destruction du Bean (utile pour fermer des connexions)

Hors "Spring Core" Strict...

AnnotationDescription
@PropertySource("classpath:app.properties")Charge un fichier de propriĂ©tĂ©s externe dans le contexte Spring đŸŒ±
@Value("${property.name}")Injecte une valeur depuis un fichier de propriétés dans un champ ou un paramÚtre
@ServiceSpécialisation de @Component, utilisée pour marquer les classes de logique métier

Spring Data ​

Gestion des Entités

AnnotationDescription
@RepositoryIndique que la classe est un "Repository" JPA, un composant qui encapsule l'accÚs aux données (DAO)
@EntityMarque une classe Java ☕ comme une entitĂ© JPA liĂ©e Ă  une table en base de donnĂ©es
@TableDéfinit le nom de la table SQL associée à l'entité
@IdDéfinit l'attribut comme la clé primaire de l'entité
@ColumnSpécifie des propriétés supplémentaires pour la colonne associée à un attribut (nom, longueur, etc...)
@TransactionalMarque une méthode ou une classe comme étant "Transactionnelle", ce qui permet de gérer l'atomicité des données pendant l'exécution de la méthode

Gestion des Relations

AnnotationDescription
@OneToOneDéfinit une relation "un à un" entre deux entités
@OneToManyDéfinit une relation "un à plusieurs" entre une entité et plusieurs autres entités
@ManyToOneDéfinit une relation "plusieurs à un" entre plusieurs entités et une entité principale
@ManyToManyDéfinit une relation plusieurs à plusieurs entre deux entités

Spring MVC ​

Gestion du ContrÎleur et de la Réponse

AnnotationDescription
@ControllerDĂ©finit une classe comme contrĂŽleur pour gĂ©rer les requĂȘtes Web
@RestControllerCombine @Controller et @ResponseBody pour crĂ©er des API REST oĂč les rĂ©ponses sont en application/json
@ResponseBodyIndique que la valeur de retour d'une méthode est directement écrite dans la réponse HTTP
@ResponseHeaderPermet d'ajouter des en-tĂȘtes HTTP personnalisĂ©s dans la rĂ©ponse

Gestion du Mapping de la RequĂȘte

AnnotationDescription
@RequestMappingMapping gĂ©nĂ©ral d'une requĂȘte HTTP (GET, POST, etc...) Ă  une mĂ©thode ou classe
@GetMappingRaccourci de @RequestMapping(method = RequestMethod.GET) pour les requĂȘtes GET
@PostMappingRaccourci de @RequestMapping(method = RequestMethod.POST) pour les requĂȘtes POST

Gestion des ParamĂštres et du Cors de la RequĂȘte

AnnotationDescription
@PathVariableExtrait une valeur dynamique de l'URL
@RequestParamRĂ©cupĂšre les paramĂštres de requĂȘte
@RequestBodyConvertit le corps de la requĂȘte application/json en un objet Java ☕
@RequestHeaderExtrait les en-tĂȘtes HTTP de la requĂȘte (Authorization, Content-Type, etc...)

Spring Security ​

Gestion de la Sécurité

AnnotationDescription
@EnableWebSecurityActive la configuration de Spring Security pour sĂ©curiser les requĂȘtes Web
@EnableGlobalMethodSecurityActive la sécurité au niveau des méthodes (via @Secured, @PreAuthorize, etc...)

Gestion du ContrÎle d'AccÚs aux Méthodes

AnnotationDescription
@Secured("ROLE_ADMIN")Restreint l'accÚs à la méthode aux utilisateurs ayant le rÎle spécifié
@RolesAllowed("ROLE_USER")Equivalent à @Secured, mais conforme à la spécification JSR-250
@PreAuthorizeÉvalue une expression Spring Expression Language (SpEL) avant l'exĂ©cution de la mĂ©thode
@PostAuthorizeÉvalue une expression Spring Expression Language (SpEL) aprĂšs l'exĂ©cution de la mĂ©thode

Exception Handler ​

AnnotationDescription
@ControllerAdviceDéfinit une classe globale pour gérer les exceptions, les "bindings" et les logiques applicatives communes
@ExceptionHandlerIndique qu'une méthode est un gestionnaire d'exceptions pour un ou plusieurs types d'exceptions spécifiés

Cache ​

Gestion du "Cache Manager" (EhCache / Caffeine / Redis)

AnnotationDescription
@EnableCachingActive la gestion du cache dans une application Spring đŸŒ±, ce qui permet d'utiliser les annotations de cache sur les mĂ©thodes
@CacheableIndique que le rĂ©sultat d'une mĂ©thode doit ĂȘtre mis en cache ; Si la mĂ©thode est appelĂ©e avec les mĂȘmes arguments, le cache est retournĂ© au lieu d'exĂ©cuter la mĂ©thode
@CacheEvictPermet de supprimer un ou plusieurs Ă©lĂ©ments du cache ; Cette annotation peut ĂȘtre utilisĂ©e aprĂšs l'exĂ©cution d'une mĂ©thode pour invalider le cache d'une ou plusieurs clĂ©s
@CachePutMet à jour le cache aprÚs l'exécution d'une méthode ; Contrairement à @Cacheable, la méthode s'exécute toujours et le résultat est ensuite mis à jour dans le cache

Lombok đŸŒ¶ïž ​

AnnotationDescription
@DataGénÚre toutes les méthodes nécessaires : @Getter, @Setter, @RequiredArgsConstructor, @EqualsAndHashCode et @ToString
@GetterGénÚre un "Getter" pour tous les attributs de la classe
@SetterGénÚre un "Setter" pour tous les attributs de la classe
@BuilderGĂ©nĂšre un Builder pour crĂ©er des objets de maniĂšre fluide (mĂȘme avec des arguments nommĂ©s)
@NoArgsConstructorGénÚre un constructeur sans argument pour la classe
@AllArgsConstructorGénÚre un constructeur avec tous les arguments (tous les champs de la classe)
@EqualsAndHashCodeGénÚre les méthodes equals() et hashCode() basées sur les attributs de la classe
@ToStringGénÚre la méthode toString() qui retourne une représentation textuelle de l'objet

Simple Logging Facade For Java ​

AnnotationDescription
@Slf4jGénÚre un objet Logger avec le nom de la classe pour faciliter l'enregistrement des logs via SLF4J

JUnit ​

Gestion des Tests Unitaires avec Mockito

AnnotationDescription
@RunWithSpécifie un "Runner" pour exécuter les tests (@RunWith(MockitoJUnitRunner.class), @RunWith(SpringRunner.class))
@ExtendWithUtilisé avec JUnit v5 pour intégrer des extensions, comme @ExtendWith(SpringExtension.class) pour intégrer Spring dans les tests unitaires
@SpringBootTestIndique que le test doit charger le contexte Spring Boot pour tester l'application en environnement intégré
@MockBean / @MockitoBeanCrĂ©e un Mock pour une dĂ©pendance Spring đŸŒ± et l'injecte dans le contexte d'application
@MockUtilisé pour créer des Mocks d'objets dans les tests avec Mockito
@InjectMocksIndique à Mockito d'injecter les Mocks dans l'objet testé (généralement un service ou un contrÎleur)
@AutoConfigureMockMvcActive la configuration de MockMVC pour les tests d'intégration des contrÎleurs Spring MVC sans démarrer un serveur
@WebMvcTestLance un test limité à la couche Web MVC de Spring, en se concentrant sur les contrÎleurs et leurs interactions HTTP (sans le contexte de l'application)
@AutoConfigureWireMockActive la configuration de WireMock pour simuler des services externes (API, bases de données, etc...) dans les tests d'intégration

Spring WebFlux 🍃 ​

Spring WebFlux est un framework rĂ©actif de Spring đŸŒ± qui permet de dĂ©velopper des applications Web asynchrones et non-bloquantes. Il repose sur le Project Reactor, qui implĂ©mente les Reactive Streams, une spĂ©cification pour le traitement asynchrone de flux de donnĂ©es.

  • Project Reactor est une bibliothĂšque Java ☕ rĂ©active qui fournit les abstractions de Mono (pour un seul Ă©lĂ©ment) et Flux (pour un flux d'Ă©lĂ©ments) pour la gestion de donnĂ©es de maniĂšre rĂ©active ;
  • Mono<T> est utilisĂ© pour reprĂ©senter un flux contenant zĂ©ro ou un Ă©lĂ©ment ;
  • Flux<T> est utilisĂ© pour des flux contenant zĂ©ro Ă  plusieurs Ă©lĂ©ments ;
  • WebClient est un composant de Spring WebFlux qui permet de faire des appels HTTP de maniĂšre asynchrone et non-bloquante ;

Publié sous licence MIT.