Spring Boot Supporting tagline
Détection & création des beans
Mécanisme standart
Spring instancie les beans, en se basant sur leurs définitions (fichiers XML, annotations, …), grâce aux multiples implémentations de BeanFactory.
BeanFactory agit également comme un référentiel des beans de l’application et les utilisateurs de ces beans doivent effectuer un lookup (par nom, type, …) pour récupérer une référence du bean désiré. Ce lookup est souvent masqué à l’utilisateur par le mécanisme d’injection de dépendances (D.I) proposé par Spring.
BeanFactory vs ApplicationContext
En gros, un ApplicationContext est une super Beanfactory, c’est à dire qu’il fait tous ce que fait une Beanfactory, mais propose d’autres actions sur les beans.
Bean Factory :
- Bean instantiation/wiring
Application Context :- Bean instantiation/wiring
- Automatic BeanPostProcessor registration
- Automatic BeanFactoryPostProcessor registration
- Convenient MessageSource access (for i18n)
- ApplicationEvent publication
voir complément dans la documentation Spring.
Avec Spring Boot
En activant le mode debug -- debug
, on remarque les traces suivantes :
Spring boot va prendre en charge automatiquement la partie “configuration des beans”, en se basant sur la présence (ou non) de classes, beans dans le CLASSPATH de l’application.
Dans les traces, on trouve la section :
-
Positive Matches indiquant les classes de configuration qui ont étées prise en comptes car elles répondaient aux conditions (@ConditionalOnClass, @ConditionalOnMissingBean, SpEL expression, …).
-
Negative Matches indiquant les classes de configuration qui n’ont pas étées prise en comptes car elles ne pas répondaient aux conditions.
Pour que cette prise en compte automatique des classes annotées avec @Configuration ait lieu, il faut ajouter l’annotation @EnableAutoConfiguration.
Cette annotation est placée sur la classe fournit en paramètre org.springframework.boot.SpringApplication.(run(…), permettant de bootstraper depuis un méthode main une application Spring.
...
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
En affichant le code source d’une classe du package d’autoconfiguration (spring-boot-autoconfigure-X-X-X-RELEASE.jar) dans un IDE, on voit facilement si une classe de configuration est prise en compte ou non.
PAS DE ROUGE –> la configuration est prise en compte
Toutes les conditions sont vérifiées, la classe AopAutoConfiguration se trouve dans la section positive matches.
DU ROUGE –> la configuration n’est pas prise en compte
@CondionalOnClass n’est pas vérifiée, la classe SecurityAutoConfiguration se trouve dans la section negative matches.
Profil
Définir un profil
Il est possible de définir plusieurs configuration de l’application en définissant un fichier application.properties
spécifique à un profil. Il suffit de créer des fichiers application-{profile}.properties
pour chaque profils.
l’annotation @profil peut être placée au niveau des classes @Configuration et @Component.
Elle peut également être placée au niveau des methodes annotées avec @Bean (dans une classe @Configuration).
Références:
Activer un profil
L’activation d’un (des) profil(s) peut se faire :
-
en commande
-Dspring.profiles.active="profile1,profile2"
-
avec l’annotation
@ActiveProfiles( profiles = {"profile1,profile2"} )
-
en configurant les paramètres de la DispatcherServlet de Spring MVC (in web.xml):
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>spring.profiles.active</param-name> <param-value>production</param-value> </init-param> </servlet>
Aggréger des profils
un fichier application-{profile}.properties
peut inclure les propriétés d’autres profil en renseignant la propriété ‘spring.profiles.include` :
spring.profiles.include: dev,dbFile
Les propriétés du fichier
application.properties
sont toujours prise en compte, quelquesoit le profil activé.
Elles peuvent cependant être modifiées par les autres profils inclus.