BeanFactory et les processeurs post-initialisation dans Spring
Définition et construction des beans
La définition d'un bean, incluant sa classe, sa portée, sa méthode d'initialisation et sa méthode de destruction, est modélisée dans Sppring par la classe AbstractBeanDefinition. Les attributs clés comprennent :
beanClass: Objet représentant la classe du bean, souvent sous forme de nom qualifié complet.scope: Chaîne indiquant la portée, par exemple Singleton (par défaut), Prototype, ou des portées spécifiques aux applications web comme Request ou Session.abstractFlag: Booléen spécifiant si la classe est abstraite, par défaut à false.lazyInit: Booléen pour l'initialisation paresseuse, par défaut à false.autowireMode: Entier pour le mode d'assemblage automatique, tel qu'aucun (par défaut), par nom, par type, ou via constructeur.initMethodName: Nom de la méthode d'initialisation.destroyMethodName: Nom de la méthode de destruction.
Pour définir ces propriétés, on peut utiliser BeanDefinitionBuilder dans un style constructeur. Ensuite, la définition est enregistrée dans la BeanFactory via beanFactory.registerBeanDefinition("nomBean", definitionBean), ce qui la stocke en tant que paire clé-valeur.
Processeurs post-initialisation
L'ajout de processeurs se fait via AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory), mais cela ne les active pas immédiatement. Il est crucial d'enregistrer d'abord les beans souhaités, puis d'ajouter ces processeurs, car ils modifient les définitions de beans chargées mais non encore instanciées.
Processeurs de BeanFactory
Ces processeurs interviennent après le chargement des définitions de beans, permettant de modifier ou d'ajouter des propriétés avant l'instanciation. Exemples incluent internalConfigurationAnnotationProcessor pour l'annotation @Configuration.
private static void executerProcesseursUsine(ListableBeanFactory usine) {
Collection<beanfactorypostprocessor> processeurs = usine.getBeansOfType(BeanFactoryPostProcessor.class).values();
if (processeurs.isEmpty()) {
return;
}
processeurs.forEach(processeur -> processeur.postProcessBeanFactory(usine));
}</beanfactorypostprocessor>
Processeurs de Bean
Ces processeurs agissent après l'instanciation des beans, par exemple pour gérer les annotations comme @Autowired ou @PostConstruct.
private static void ajouterProcesseursBean(ListableBeanFactory usine) {
Collection<beanpostprocessor> processeurs = usine.getBeansOfType(BeanPostProcessor.class).values();
if (processeurs.isEmpty()) {
return;
}
processeurs.forEach(usine::addBeanPostProcessor);
}</beanpostprocessor>