Cycle de vie du conteneur à ressort

Cycle de vie du conteneur à ressort

La ConfigurableApplicationContext.refresh()méthode d' exécution est le point d'entrée principal pour le début du cycle de vie du conteneur Spring. L'appel BeanDefinitionRegistryPostProcessoret les BeanFactoryPostProcessordeux post-traitements sont les étapes les plus importantes, car la méthode d' ConfigurationClassPostProcessorexécution est déclenchée pour réaliser l'analyse du fichier de classe dans le package spécifié sous le chemin de classe .postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
Insérez la description de l'image ici

Comprendre BeanDefinition

BeanDefinitionEst une interface utilisée pour décrire les informations Bean, telles que les attributs, les paramètres du constructeur, la portée du bean, le chargement différé, etc. Lors de l'appel pour applicationContext.getBean(…)obtenir l'objet d'instance Bean, si le Bean n'a pas été créé, le Bean sera créé via BeanDefinitionles informations de description dans BeanDefinition. BeanDefinition possède les classes d'implémentation importantes suivantes.
Insérez la description de l'image ici

  1. AnnotatedGenericBeanDefinitionL'encapsulation est utilisée dans la classe de démarrage .
  2. Les classes analysées sous l'analyse du package classpath sont utilisées :, vous pouvez le voir ScannedGenericBeanDefinitionà la ClassPathScanningCandidateComponentProviderligne 418.
  3. Utilisé par les haricots importés AnnotatedGenericBeanDefinition.
    Par exemple: la spring.factoriesclasse configurée est le bean importé par la classe de démarrage, et la classe de configuration interne non statique org.springframework.context.annotation.ConfigurationClassBeanDefinitionReaderpeut être vue au point d' arrêt sur la ligne 137
  4. Par @Beanméthode de configuration utilisant le bean ConfigurationClassBeanDefinition
    Lorsque vous appelez applicationContext.getBean()getting Bean, si vous n'avez pas encore créé l'objet bean, AbstractBeanFactory.getMergedLocalBeanDefinition()les différents types se BeanDefinitiontransforment enRootBeanDefinition

Connaître BeanFactoryPostProcessor

Les plants de haricots traduits dans le processeur chinois, les développeurs peuvent implémenter cette interface, la méthode d'interface dans laquelle postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)en beanFactorymodifiant les propriétés BeanDefinition existantes , peut également être utilisée pour ajouter manuellement une personnalisation BeanDefinition.

BeanDefinitionRegistryPostProcessorOui BeanFactoryPostProcessor, la sous-classe a ajouté des postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)méthodes et les fonctions des deux méthodes d'interface sont fondamentalement les mêmes.
Mais les postProcessBeanDefinitionRegistry(…)méthodes de la sous-classe sont postProcessBeanFactory(…)exécutées avant les méthodes de la classe parent .
Insérez la description de l'image ici

2.1 Appelez la méthode prepareRefresh () pour activer le conteneur

Cette méthode est appelée uniquement pour définir AbstractApplicationContextla AtomicBoolean activevaleur de la variable membre dans sur true, ce qui signifie que le conteneur Spring est activé et que la applicationContext.getBean(…)méthode peut être appelée. Les appels avant cela lèveront une exception « n'a pas encore été actualisé ».

2.2 Configurer les composants nécessaires requis par l'objet ConfigurableListableBeanFactory

prepareBeanFactory(ConfigurableListableBeanFactory beanFactory)Cette méthode est principalement utilisée pour ajouter certains composants d'initialisation nécessaires à beanFactory:

  1. Ajouter àSpringEL表达式解析器
  2. Ajoutez un ApplicationContextAwareProcessorpost-processeur, qui est utilisé pour détecter s'il est implémenté lors de l'instanciation du Bean Aware方法et pour réaliser l'injection.
  3. Ajoutez un ApplicationListenerDetectorpost-processeur pour détecter si le bean est implémenté ApplicationListener, et si tel est le cas, ajoutez-le à AbstractApplicationContextl'ensemble des écouteurs.

2.3 Appelez BeanFactoryPostProcessor pour réaliser l'analyse des paquets

  1. Récupérez AbstractApplicationContextles variables membres beanFactoryPostProcessorsenregistrées dans le BeanFactoryPostProcessorparcours pour appeler la BeanDefinitionRegistryPostProcessorclasse d'implémentation d'interface. Pour le moment, il n'y a que trois BeanFactoryPostProcessorclasses d'implémentation, mais seules les deux premières implémentent l' BeanDefinitionRegistryPostProcessorinterface.
    A. CachingMetadataReaderFactoryPostProcessor
    Registre SharedMetadataReaderFactoryBeanplante du haricot, qui atteint la classe d'interface FactoryBean est principalement utilisé lors de la lecture du chemin de la numérisation de documents sous les informations de classe de catégorie, classe liée à: SimpleMetadataReader,ClassPathScanningCandidateComponentProvider

    B. ConfigurationWarningsPostProcessor
    Il est utilisé pour vérifier le package d'analyse défini sur la classe de démarrage. Le package d'analyse défini par l'utilisateur ne peut pas être: org.springframeworket org, sinon une exception sera levée.

    C. PropertySourceOrderingPostProcessor
    PropertySourceOrderingPostProcessorUniquement réalisé BeanFactoryPostProcessor, le but est de mettre ConfigurableEnvironmentle nom " defaultProperties" PropertySourceà la fin de la collection

  2. En beanFactory.getBeanNamesForType(…)obtenant la BeanDefinitionRegistryPostProcessorcollection de noms de classe qui implémentent l' interface dans le conteneur Spring et en la parcourant, si le bean est également PriorityOrderedla classe d'implémentation de l' interface, en getBean()obtenant l'objet d'instance, il n'y en a qu'un dans le conteneur à ce moment ConfigurationClassPostProcessor, ce qui est principalement utilisé pour l'analyse de fichiers sous le chemin de classe .

  3. Appelez la méthode ConfigurationClassPostProcessorimplémentée postProcessBeanDefinitionRegistry()pour démarrer l'analyse du chemin de classe . En SimpleMetadataReaderspécifiant le fichier de classe sous le package, si la classe analysée est une classe de configuration, ou @Importla classe importée via des annotations, il continuera à déterminer s'il s'agit d'une classe de configuration de manière récursive, jusqu'à ce qu'elle soit analysée en un Bean ordinaire, puis passé this.reader.loadBeanDefinitions(configClasses)et filtré pour répondre aux exigences des commentaires conditionnelsBeanDefinition

  4. Parce qu'une fois l'analyse du chemin de classe effectuée, il peut y avoir des beans qui implémentent BeanDefinitionRegistryPostProcessoret BeanFactoryPostProcessorinterfèrent, vous devez donc beanFactory.getBeanNamesForType(…)récupérer la BeanDefinitionRegistryPostProcessorcollection de noms de classe qui implémentent l' interface dans Spring , supprimer les classes d'implémentation ConfigurationClassPostProcessorqui ont été appelées et parcourir les noms de bean pour obtenir Orderedles instances qui implémentent l' interface. Après le tri Méthode d'interface de rappel

  5. Dans while (réitérer), parcourez BeanDefinitionRegistryPostProcessorles beans qui n'implémentent pas l'interface de tri .

    Pourquoi utiliser l'instruction while ? Pour éviter d'injecter une nouvelle BeanDefinitionRegistryPostProcessorclasse d'implémentation dans la méthode de rappel . Cela peut appeler le nouveauBeanDefinitionRegistryPostProcessor

  6. Méthode de BeanDefinitionRegistryPostProcessorsuperclasse de rappel sans triBeanFactoryPostProcessorpostProcessBeanFactory(beanFactory)

  7. Obtenez la BeanFactoryPostProcessorclasse d'implémentation de l' interface, triez et triez en fonction du type d'interface de tri et rappelez la méthode d'interface

    • Traverser l'exécution pour réaliser le org.springframework.core.PriorityOrderedtriBeanFactoryPostProcessor
    • Traverser l'exécution pour réaliser le org.springframework.core.OrderedtriBeanFactoryPostProcessor
    • L'exécution de la traversée n'implémente pas l'interface de triBeanFactoryPostProcessor

2.4 Enregistrer les BeanPostProcessors pour le traitement des beans

  1. En beanFactory.getBeanNamesForType(…)obtenant BeanPostProcessorla collection beanName du type

  2. Traverse beanNames , catégoriser et trier en fonction du type d'interface de tri. Si elle est une MergedBeanDefinitionPostProcessorclasse de mise en œuvre, il sera également stocké séparément dans une collection. Cette interface est utilisée principalement pour l' usage interne du printemps. Enfin, les trois collections suivantes sont obtenues, par abstractBeanFactory.addBeanPostProcessor(postProcessor)économieBeanPostProcessor

  3. Add ApplicationListenerDetector, utilisé pour collecter la classe d'implémentation de l'écouteur d'événements et l'ajouter à la AbstractApplicationContext的applicationListenerscollection

    Précautions: enregistré BeanPostProcessor, l'appel sera getBean(beanName)obtenu BeanPostProcessor实例对象, et getBean()la méthode interne appellera le BeanPostProcessorprocessus Bean nouvellement créé existant , de sorte que le premier enregistré BeanPostProcessoraprès le processus d'enregistrement peut être BeanPostProcessor, par exemple:
    implémenter PriorityOrderedl'interface BeanPostProcessoraprès le processus d'enregistrement pour réaliser Orderedla BeanPostProcessor
    réalisation de Orderedl'interface le BeanPostProcessorsera enregistré après le traitement n'a pas atteint l'interface de triBeanPostProcessor

2.5 Enregistrer le diffuseur d'événements dans le conteneur Spring

initApplicationEventMulticaster()La méthode beanFactory.registerSingleton()est utilisée pour diffuser des événements en enregistrant un diffuseur d'événements avec le conteneur Spring

2.6 Enregistrer l'écouteur d'événements

Utilisé pour charger l'écouteur configuré par le développeur via des annotations, et ne peut écouter que ContextRefreshedEventles événements suivants

2.7 Terminer l'instanciation de tous les Beans chargés non paresseux

finishBeanFactoryInitialization(beanFactory);Obtenez principalement tous les beanNames , parcourez la AbstractBeanFactory.getBean(name)méthode pour terminer la création du bean. Une fois tous les beans instanciés, repassez l'instance du bean, trouvez SmartInitializingSingletonles beans qui implémentent l' interface et rappelez les méthodes d'interface.

2.8 Post événement ContextRefreshedEvent

ContextRefreshedEventÉvénements ApplicationStartedEventet ApplicationReadyEventpublication avant l'événement.

Je suppose que tu aimes

Origine blog.csdn.net/u013202238/article/details/113481529
conseillé
Classement