Heim  >  Artikel  >  Java  >  Wie Spring Objekte einfügt und wie der Bean-Erstellungsprozess analysiert wird

Wie Spring Objekte einfügt und wie der Bean-Erstellungsprozess analysiert wird

angryTom
angryTomnach vorne
2019-11-28 17:47:533091Durchsuche

Wie Spring Objekte einfügt und wie der Bean-Erstellungsprozess analysiert wird

Zuerst müssen Sie eine grobe Implementierung kennen

● Dieser Injektionsprozess muss in BeanPostProcessor implementiert werden

●Spring instanziiert Beans in beanFactory.getBean, also verzögertes Laden

● Gemäß dem zweiten Artikel werden also alle BeanPostProcessor

nur aufgerufen, wenn getBean ● Im zweiten Artikel wurde erwähnt, dass der Aktualisierungsprozess von BeanFactory nur BeanPostProcessor registriert und tatsächlich in der getBean-Methode

ausgeführt wird (empfohlenes Video: Java-Video-Tutorial). )

MergedBeanDefinitionPostProcessor ist auch eine Art BeanPostProcessor. Er erstellt eine neue Lebenszyklusfunktion und ersetzt die Standardlebenszyklusfunktion von BeanPostProcessor ein kurzer Quellcode

for (BeanPostProcessor bp : getBeanPostProcessors()) {
    if (bp instanceof MergedBeanDefinitionPostProcessor) {
        MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
        bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
    }
}

Es ermöglicht Ihnen, die Bean-Definition in einem Nicht-BeanFactoryProcess zu ändern

InstantiationAwareBeanPostProcessor ist auch ein BeanPostProcessor. Es definiert auch eine Lebenszyklusfunktion neu, die das Einfügen von Attributwerten ermöglicht in Attributobjekte

@Autowired Der Prozess des Ladens von Definitionen

Sehen wir uns zunächst nicht den Bean-Erstellungsprozess an, sondern die Implementierungsunterklasse von MergedBeanDefinitionPostProcessor Name erraten

AutowiredAnnotationBeanPostProcessor Dies sollte sein, was es tut, damit wir uns direkt den Code der postProcessMergedBeanDefinition-Methode von

AutowiredAnnotationBeanPostProcessor ansehen können.

Nach dem Methodenaufruf können Sie erkennen, dass sich diese Annotationen tatsächlich in buildAutowiringMetadata befinden. Schließlich registriert checkConfigMembers Member in der Bean-Definition. Leser, die herausfinden möchten, wie sie diese finden, können den Quellcode selbst überprüfen .

Hier registrieren wir einfach das Mitglied in der Bean-Definition, und die eigentliche Instanziierung erfolgt während des Füllvorgangs des Beans. Lassen Sie uns unten über den Bean-Erstellungsprozess sprechen, um zu erfahren, wann es injiziert wird.

Bean-Erstellungsprozess

Wie bereits erwähnt, erstellt Spring Bean im Prozess von getBean. Das Erstellen einer Bean ist in mehrere Schritte unterteilt

1. Bean-Definition abrufen

2. Neue Bean()

3. Lebenszyklusfunktion ausführen

5 die Bean

6. Führen Sie die Lebenszyklusfunktion aus (nachher)

Der Eingang ist BeanFactory.getBean und die Implementierungsklasse von BeanFactory ist DefaultListableBeanFactory. Sie finden diese im Aktualisierungsprozess von BeanFactory

Wenn die Bean laut Quellcode noch nicht existiert, wird der Bean-Erstellungsprozess ausgeführt

Holen Sie sich die Bean-Definition in diesem Quellcode

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

Folgen Sie ihr Suchen Sie nach seinen Abhängigkeiten gemäß dem Bean-Definitionselement und erstellen Sie die Bean. Es ist ersichtlich, dass die Bean rekursiv erstellt wird

String[] dependsOn = mbd.getDependsOn();
for (String dep : dependsOn) {
    getBean(dep);
}

und dann die Bean erstellt wird

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

Der erste Schritt besteht darin, die Bean zu erstellen. Schritt 1: Führen Sie alle Prozessoren aus, einschließlich MergedBeanDefinitionPostProcessor. Registrieren Sie also die Injektionsoption > In diesem Schritt wird die Bean erstellt. Die hier durchgeführte @Autowired-Injektion ist

if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
}

der letzte Verarbeitungsprozess von AutowiredAnnotationBeanPostProcessor

applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

Da die Abhängigkeiten zuvor abgerufen und in den Container geworfen wurden, können Sie sie hier einfach direkt mithilfe von Reflection einschreiben.

Bean erstellen. Der vierte Schritt besteht darin, die Bean zu initialisieren. Hier gibt es eine Methodeninjektion. Die Methodeninjektion erfolgte ursprünglich während der Initialisierung der Bean, und die Lebenszyklusfunktion wird ausgeführt, einschließlich des Pre-Post-Lebenszyklus des BeanPostProcessor, der Initialisierungsmethode usw.

Kleine Erklärung: AutowiredAnnotationBeanPostProcessor ist beides ein MergedBeanDefinitionPostProcessor und ein InstantiationAwareBeanPostProcessor

Dieser Artikel stammt von der chinesischen PHP-Website, Spalte

Java-Tutorial

, willkommen zum Lernen!

Das obige ist der detaillierte Inhalt vonWie Spring Objekte einfügt und wie der Bean-Erstellungsprozess analysiert wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen