<code>/**<br> * spring debug<br> * @author huangfu<br> */<br>public class SpringDebug {<br>public static void main(String[] args) {<br> AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SpringDebugConfig.class);<br> }<br>}<br></code>
J'estime que la ligne de code ci-dessus est très familière à tous ceux qui ont utilisé Spring. Sinon, je vous conseille d'apprendre d'abord à l'utiliser. , puis plongez dans du code source La logique sous-jacente !
Voyons comment il instancie le bean étape par étape, prend le contrôle du bean, puis exécute diverses classes de cycle de vie ! Commençons par deviner. Lorsque Spring lit ces beans, les informations sur les beans doivent être stockées sur une certaine entité. Alors, quelle est cette entité ? Cette classe est BeanDefinition, alors que stocke-t-elle ? Jetons un coup d'œil à sa sous-classe AbstractBeanDefinitionBeanDefinition那么他存储了什么东西呢?我们看一下它的子类AbstractBeanDefinition
Il définit des valeurs d'attribut similaires à celle-ci. Bien sûr, l'auteur a intercepté quelques attributs, et il y a bien plus d'attributs Bien plus que cela, son objectif est que lorsque le bean est instancié, les données requises n'ont plus besoin d'être obtenues par réflexion, mais sont lues tout au long de l'initialisation de Spring. Il suffit de les prendre à partir d'ici lorsque cela est nécessaire. bd Après, on se le demande ? Où le stocke-t-il après l’avoir lu ? La réponse est de le stocker dans beanFactory, donc Spring implémentera certainement d'abord une bean factory lors de l'initialisation ! En entrant AnnotationConfigApplicationContext, vous constaterez qu'il n'a pas été initialisé. Où l'initialiser ? Comme nous le savons tous, lorsqu'une classe est réinitialisée, le constructeur de la classe parent sera chargé en premier, nous devons donc jeter un œil à sa classe parent GenericApplicationContext:
rrreee
Comme prévu, c'est la classe parent. La fabrique du bean est créée à l'intérieur, et la fabrique est là. Nous continuons à revenir à AnnotationConfigApplicationContext et regardons vers le bas : nous constatons qu'elle appelle un this(), indiquant qu'elle appelle. son propre constructeur vide, nous entrons donc Jetez un œil :
rrreee
"À ce stade, nous pouvons regarder l'image ci-dessus : la bean factory est là lors de l'initialisation"
"Puis vider Le lecteur est initialisé dans la méthode de construction ! 》
2. Fonctions de baseD'accord, si nous allons plus loin, nous saurons que nous sommes sur le point d'analyser les classes sous ces packages et de les transformer en beans, puis nous continuerons à descendre et à aller à refresh(). ;Cette méthode est incroyable. C'est la méthode de base de toute l'initialisation de Springbean. Si vous la comprenez, vous pourrez comprendre l'instanciation, les rappels et d'autres problèmes de Spring :
. Après notre arrivée, nous avons une méthode Pour analyser les fonctions qu'une méthode remplit, la première est :
1). de l'usine Spring créée précédemment est vide, cette méthode consiste à effectuer une série d'opérations de valeur d'initialisation pour lui ! ' ' s ' s 1 donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc donc... Elle n'est actualisée qu'une seule fois et les erreurs sont signalées plusieurs fois. La fabrique de beans actuellement utilisée est renvoyée. Lorsque l'étape est XML, une nouvelle fabrique est renvoyée. créé et renvoyé. Conteneur Bean, enregistrez certains de ses propres post-processeurs Bean intégrés dans beanFactory, qui est généralement appelé BeanPostProcessor. Cette méthode est en fait une usine de réinitialisation !❞ postProcessBeanFactory(beanFactory); Cela signifie que les développeurs Spring souhaitent que l'appelant l'utilise lors de la personnalisation de l'extension ! N i i). InvokebeanFactoryPostProcessors (Beanfactory);
❝
croit en fait que le nom, la plupart des lecteurs peuvent deviner que son objectif est d'analyser l'enregistrement BD des classes non configurées dans l'usine pour tous les BeanFactoryPostProcessorscode>, le premier point d'extension apparaît ici. Lors de la personnalisation de <code>BeanFactoryPostProcessors, son timing de rappel correspond au moment où Spring lit tout ce que BeanDefinition est appelé ultérieurement. Les lecteurs peuvent se référer à Baidu pour des méthodes d'utilisation spécifiques. !
❞ registerBeanPostProcessors(beanFactory); registerBeanPostProcessors(beanFactory); Enregistrez le processeur dans la fabrique de bean ! Je me demande si vous avez utilisé le point d'extension de l'interface beanPostProcessor ? Il est enregistré dans l'usine Spring selon cette méthode. Bien sûr, veuillez noter qu'il est uniquement enregistré et non exécuté ! N'oubliez pas et ne le faites pas !
的 的 的 的 的 的 的 的 的 的 的 est encapsulé pour la programmation d'événements De manière générale, les événements. sont divisés en trois rôles. Publication d'événements), Écouteur d'événements (écoute des événements), Source d'événement (informations spécifiques sur l'événement) trois rôles. le diffuseur de l'événement ! Sur 9). Onrefresh ();
❝
Voici un autre point d'expansion. Spring ne s'en rend pas compte, et le fournisseur est réalisé !
❞ registerListeners(); Cette méthode est un point important, elle consiste à instancier tous les singletons restants (initialisation non paresseuse). Ce que nous appelons l'instanciation du bean, l'injection, la résolution des dépendances circulaires, le rappel beanPostProcessor et d'autres opérations sont tous implémentés ici ! ❞ . Les événements intégrés du printemps ❞ 🎜🎜🎜🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer