Le Framework Spring PDF
Document Details
Uploaded by SelfRespectSagacity9833
Youssef SAADI
Tags
Summary
Ce document présente le framework Spring, en insistant sur l'injection de dépendances. Il détaille la gestion des beans et des configurations dans le développement Java. Il couvre les notions de couplage fort et faible.
Full Transcript
Le Framework Spring 1 - Injection des dépendances 2 - Gestion des beans et des configurations Plan + Couplage fort et couplage faible (Tight Coupling vs. Loose Coupling) + Injection de dépendance via Spring + Définition des beans Spring...
Le Framework Spring 1 - Injection des dépendances 2 - Gestion des beans et des configurations Plan + Couplage fort et couplage faible (Tight Coupling vs. Loose Coupling) + Injection de dépendance via Spring + Définition des beans Spring + Java Configuration + Portée des beans + Les propriétés et les profiles @[email protected] (Youssef SAADI) 2 Couplage Fort vs. Couplage faible + Le couplage fort se produit lorsque les classes sont fortement dépendants les uns des autres. + Le couplage faible se produit lorsque les classes sont peu dépendants les uns des autres. + L'idée est de minimiser les dépendances pour améliorer la modularité et la testabilité du code. Le couplage faible est souvent atteint en utilisant des interfaces, des classes abstraites, ou des injections de dépendances. + Cela permet de remplacer ou de modifier les composants sans affecter le reste du système. @[email protected] (Youssef SAADI) 3 Couplage Fort Dans cet exemple, la classe Car est fortement couplée à la classe Engine. Si le constructeur ou le comportement de Engine change, cela impacte directement Car. @[email protected] (Youssef SAADI) 4 Couplage faible et Injection de Dépendances Injection via setter Injection via constructeur @[email protected] (Youssef SAADI) 5 Couplage faible et Injection de Dépendances @[email protected] (Youssef SAADI) 6 Spring IoC + L'injection de dépendance consiste à fournir les dépendances (objets requis par une classe) depuis l'extérieur de cette classe, plutôt que de les créer ou de les chercher directement au sein de celle-ci. + En d'autres termes, plutôt que de créer ses propres dépendances, une classe les reçoit (les injecte) via un mécanisme externe, généralement un conteneur d'inversion de contrôle (IoC container) comme celui de Spring. @[email protected] (Youssef SAADI) 7 Spring IoC POJOs Classes de votre application Conteneur d'Injection de Métas donnés de Dépendances configuration (ApplicationContext) Crée Une application système entièrement configurée et prête à l'utilisation @[email protected] (Youssef SAADI) 8 Ordre d'injection via Spring IoC + Spring offre trois types principaux d'injection de dépendance : Via Constructeur Via champs annotés par "Autowired" Via méthodes setter. + Spring injecte les dépendances via le constructeur en premier. Ensuite, il injecte les dépendances directement dans les champs. Enfin, il injecte les dépendances via les méthodes setter. @[email protected] (Youssef SAADI) 9 Définition des Beans en utilisant du code Java Dépendance requise pour réaliser le transfert d'argent entre comptes @[email protected] (Youssef SAADI) 10 Définition des Beans en utilisant du code Java Dépendance requise pour accéder aux données @[email protected] (Youssef SAADI) 11 Instructions de configuration des Beans @[email protected] (Youssef SAADI) 12 Accès aux Beans depuis le contexte de l'application + Dans Spring : On utilise des implémentations de ApplicationContext pour créer le contexte de l'application Où localiser les définitions des Beans + Dans SptingBoot: @[email protected] (Youssef SAADI) 13 Accès aux Beans depuis le contexte de l'application + Trois façons d'accéder aux Beans : @[email protected] (Youssef SAADI) 14 Gestion de plusieurs fichiers de configuration + Votre fichier de configuration @Configuration peut devenir assez gigantesque. + Pour cela; créer plusieurs fichiers de configuration et les combiner via l'annotation @Import. + Créer un fichier de configuration central pour le contexte d'application qui regroupe l'ensemble des beans de l'application. @[email protected] (Youssef SAADI) 15 Les beans de la couche service Les beans de la couche service Les beans de la couche DAO Application Les beans de la couche DAO Infrastructure La datasource La datasource Une seule configuration mixte Deux classes de configuration + Adopter le principe de séparation des préoccupations Plusieurs fichiers de + Les beans en relation à placer dans le même fichier de configuration configuration + Meilleures pratiques : séparer entre l'infrastructure (datasource) et l'application. @[email protected] (Youssef SAADI) 16 Plusieurs fichiers de configuration Les beans communs de l'application Les beans d'Infrastructure de test @[email protected] (Youssef SAADI) 17 Gestion des dépendances entre les Beans + @Autowired : pour injecter les beans définis ailleurs (depuis l'extérieur). @[email protected] (Youssef SAADI) 18 Portée des Beans (@Scope) + singleton (portée par défaut) + prototype + request + Session +... @[email protected] (Youssef SAADI) 19 Utilisation des propriétés externes + Codage en dur de ces propriétés est une mauvaise pratique + Une bonne pratique : externaliser ces propriétés @[email protected] (Youssef SAADI) 20 Le bean Environment + Le bean Environment : représente les propriétés chargées depuis l'environnement d'exécution. + Les propriétés sont dérivées depuis plusieurs sources dans cet ordre: Les propriétés système de JVM : System.getProperty() Les variables d'environnement système : System.getenv() Les fichiers de propriétés Java. @[email protected] (Youssef SAADI) 21 Externaliser les propriétés @[email protected] (Youssef SAADI) 22 Les fichiers de propriétés + Les variables d'environnement et les variable système JVM sont peuplées automatiquement. + Pour inclure d'autres fichiers de propriétés dans l'environnement, il faut indiquer ceci à Spring via l'annotation @PropertySource + Les préfixes à utiliser dans cette annotation : classpath, file, http … @[email protected] (Youssef SAADI) 23 Alternative à l'utilisation du bean Environment + Si l'on ne veut pas utiliser directement Environment, on peut accéder aux propriétés via @Value. @[email protected] (Youssef SAADI) 24 + Les profiles peuvent représenter un environnement : dev, Les profiles + test, production Ou une implémentation : jdbc, jpa + Ou une plateforme de déploiement : sur place, cloud + Les beans peuvent être inclus ou exclus selon un certain profile. @[email protected] (Youssef SAADI) 25 @Profile au niveau classe + Tous les beans de cette configuration appartiennent au profile "embedded" et ne seront initialisés seulement lorsque ce profile est activé. @[email protected] (Youssef SAADI) 26 @Profile au niveau méthode + "!embedded" Indique que ce profile sera activé quand "embedded" n'est plus activé. @[email protected] (Youssef SAADI) 27 Activation d'un profile lors de l'exécution + Il s'agit d'une propriété système qu'il faut initialisé lors de l'exécution de l'application. On distingue deux méthodes : + Activation via la ligne de commande + Activation via du code Java + Dans un environnement de test d'intégration, on pourra faire usage de l'annotation @ActiveProfiles @[email protected] (Youssef SAADI) 28 Quels sont les profils qui seront sélectionnés? @[email protected] (Youssef SAADI) 29 @Profile et @PropertySource + @profile peut contrôler quelle source de propriétés à inclure dans l'environnement (@ProperySource). @[email protected] (Youssef SAADI) 30 SpEL : Le langage d'expression Spring Accès aux propriétés Option 1 Option 2 @[email protected] (Youssef SAADI) 31 SpEL : Accès aux beans @[email protected] (Youssef SAADI) 32 SpEL : Le langage d'expression Spring + Les propriétés sont des chaines de caractères + Conversion implicite de String vers int @[email protected] (Youssef SAADI) 33 SpEL : valeur par défaut (fall-back value) + Si daily.limit est non définie, on utilisera la valeur par défaut: @[email protected] (Youssef SAADI) 34 Balayage des composants + Configuration explicite : définition des beans en utilisant @Bean dans les fichiers de configuration Java. + Configuration implicite : en utilisant des stéréotypes et balayage des composants. + Les stéréotypes de @Component: @Repository; @Service @[email protected] (Youssef SAADI) 35 @ComponentScan @[email protected] (Youssef SAADI) 36 Injection des dépendances via Autowired + Injection via constructeur (pratique recommandée) + Injection via méthode + Injection via champs (l'injection est réalisée même si le champ est privé ==> cette pratique à ne pas recommander surtout que c'est difficile de tester ces champs) @[email protected] (Youssef SAADI) 37 @Autowired (required=false) vs. Optional + Par défaut, le comportement de @Autowired est "required = true"; ceci signifie que si on n'arrive pas à injecter une dépendance (une dépendance inexistante) une exception sera levée. + @Autowired (required = false) : l'injection sera réalisée seulement s'il y a une dépendance. + Une autre façon d'injecter des dépendances optionnelles est d'opter pour Optional qui a été introduit pour réduire les erreurs de pointeurs nuls en Java. @[email protected] (Youssef SAADI) 38 Ambiguïté d'injection @[email protected] (Youssef SAADI) 39 Initialisation retardée + Les beans en général sont créés au démarrage quand le contexte d'application est créé. + Les beans Lazy seront créés quand ils seront utilisés pour la première fois: Quand la dépendance est injectée Quand il y a appel à la méthode ApplicationContext.getbean + Cette pratique est utile quand les dépendances d'un certain bean ne sont pas disponible au démarrage. @[email protected] (Youssef SAADI) 40 Java Configuration vs. Annotations @[email protected] (Youssef SAADI) 41 Les choix de configuration + @Autowired: L'injection par constructeur: + Si la classe a seulement un constructeur par défaut ==> rien à annoter + Si la classe a un seul constructeur non par défaut (le seul disponible dans la définition de la classe) ==> Spring va l'appeler automatiquement (@Autowired est optionnel dans ce cas) + Si la classe dispose de plus qu'un seul constructeur : Spring par défaut va appeler le constructeur qui n'a pas d'argument s'il existe Sinon vous devez annoter par @Autowired celui que vous voulez que Spring utilise. + Pour le balayage des composants mieux opter pour un balayage restrictif: @[email protected] (Youssef SAADI) 42 Questions ?? @[email protected] (Youssef SAADI) 43