Maison > Java > javaDidacticiel > le corps du texte

Comment Spring injecte les objets et analyse du processus de création du bean

angryTom
Libérer: 2019-11-28 17:47:53
avant
3145 Les gens l'ont consulté

Comment Spring injecte les objets et analyse du processus de création du bean

Vous devez d'abord connaître une implémentation approximative

● Ce processus d'injection doit être implémenté dans BeanPostProcessor

●spring instancie les beans dans beanFactory.getBean, c'est-à-dire un chargement paresseux

● Selon le deuxième article, c'est-à-dire que tous les BeanPostProcessors ne seront appelés que lorsque getBean

● Le deuxième article mentionnait que le processus d'actualisation de BeanFactory enregistre uniquement BeanPostProcessor et est en fait exécuté dans la méthode getBean

(vidéo recommandée : tutoriel vidéo Java )

MergedBeanDefinitionPostProcessor est également une sorte de BeanPostProcessor. Il crée une nouvelle fonction de cycle de vie, remplaçant la fonction de cycle de vie par défaut de BeanPostProcessor. un code source court

for (BeanPostProcessor bp : getBeanPostProcessors()) {
    if (bp instanceof MergedBeanDefinitionPostProcessor) {
        MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
        bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
    }
}
Copier après la connexion

Il permet de modifier la définition du Bean dans un non-BeanFactoryProcess

InstantiationAwareBeanPostProcessor est également un BeanPostProcessor Il redéfinit également une fonction de cycle de vie, qui permet d'injecter des valeurs d'attribut. dans les objets d'attribut

@Autowired Le processus de chargement des définitions

Ne regardons pas d'abord le processus de création du bean, mais regardons la sous-classe d'implémentation de MergedBeanDefinitionPostProcessor Voici le. nom deviner

AutowiredAnnotationBeanPostProcessor Cela devrait être ce qu'il fait, afin que nous puissions regarder directement le code de la méthode postProcessMergedBeanDefinition de

AutowiredAnnotationBeanPostProcessor.

Suite à l'appel de la méthode, vous pouvez savoir que buildAutowiringMetadata est l'endroit où se trouvent réellement ces annotations. Enfin, checkConfigMembers enregistre Member dans la définition du bean. Les lecteurs qui souhaitent savoir comment le trouver peuvent vérifier la source. coder eux-mêmes.

Ici, nous enregistrons simplement le membre dans la définition du bean, et l'instanciation réelle se produit pendant le processus de remplissage du bean. Parlons ci-dessous du processus de création du bean pour savoir quand il est injecté.

Processus de création du bean

Comme mentionné précédemment, Spring crée Bean dans le processus getBean. La création d'un bean est divisée en plusieurs étapes

1. Obtenez la définition du bean

2. new Bean()

3 Exécuter la fonction de cycle de vie (avant)

4 Créer des dépendances

5 . le bean

6. Exécuter la fonction de cycle de vie (après)

L'entrée est BeanFactory.getBean et la classe d'implémentation de BeanFactory est DefaultListableBeanFactory Vous pouvez les trouver dans le processus d'actualisation de BeanFactory.

Selon le code source, si le bean n'existe pas encore, le processus de création du bean sera exécuté

Récupérez la définition du bean dans ce code source

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
Copier après la connexion

Suivez-le , recherchez ses dépendances en fonction de l'élément de définition du bean et créez le bean. On peut voir que le bean est créé de manière récursive

String[] dependsOn = mbd.getDependsOn();
for (String dep : dependsOn) {
    getBean(dep);
}
Copier après la connexion

puis le bean est créé

if (mbd.isSingleton()) {
    createBean(beanName, mbd, args);
}
// 真正的执行在 doCreateBean 过程中
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
Copier après la connexion

. est de créer le bean. La première étape consiste à créer le bean. La deuxième étape consiste à créer le bean. Étape 1 : Exécutez tous les processeurs, y compris MergedBeanDefinitionPostProcessor, donc enregistrez l'option d'injection

if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Copier après la connexion

dans cette étape. créer le bean. La troisième étape consiste à remplir le bean. L'injection @Autowired effectuée ici est

applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
Copier après la connexion

dans la fonction postProcessPropertyValues ​​​​de AutowiredAnnotationBeanPostProcessor

populateBean(beanName, mbd, instanceWrapper);
Copier après la connexion

En raison des dépendances. ont été obtenus précédemment et jetés dans le conteneur, vous pouvez donc ici les écrire directement en utilisant la réflexion

Créer le bean La quatrième étape consiste à initialiser le bean. Il y a une méthode d'injection ici La méthode d'injection s'est produite à l'origine. en cours d'initialisation du bean, et la fonction de cycle de vie est exécutée, y compris le cycle de vie pré-post du BeanPostProcessor, la méthode d'initialisation, etc.

Petite explication : AutowiredAnnotationBeanPostProcessor est à la fois un MergedBeanDefinitionPostProcessor et un InstantiationAwareBeanPostProcessor

Cet article provient du site Web php chinois, colonne

tutoriel Java

, bienvenue pour apprendre !

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal