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!