Détection & création des beans

Mécanisme standart

spring bean factory

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 auto-configuration-positive-matches

spring auto-configuration-negative-matches

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 comptespring auto-configuration-positive-matches-in-IDE
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 spring auto-configuration-negative-matches-in-IDE
@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.



Published

24 October 2014

Tags