Als beliebteste und leistungsstärkste, leichte Rahmen in Java wurde der Frühling von den Programmierern herzlich begrüßt. Es ist sehr notwendig, den Lebenszyklus der Frühlingsbohne genau zu verstehen. Wir verwenden normalerweise ApplicationContext als Federcontainer. Hier sprechen wir auch über den Lebenszyklus von Bohnen in ApplicationContext. Tatsächlich ist Beanfactory ähnlich, aber der Prozessor muss manuell registriert werden.
1. Lebenszyklusflussdiagramm:
Der volle Lebenszyklus einer Frühlingsbohne beginnt mit der Erstellung eines Federbehälters, bis der Federbehälter schließlich die Bohne zerstört, die eine Reihe von Schlüsselpunkten enthält.
Wenn der Container die obigen verschiedenen Schnittstellen registriert, wird das Programm gemäß dem obigen Prozess durchgeführt. Die Funktionen jeder Schnittstelle werden nachstehend ausführlich erläutert.
2. Klassifizierung verschiedener Schnittstellenmethoden
Der vollständige Lebenszyklus einer Bohne erfährt verschiedene Methodenaufrufe, die in die folgenden Kategorien unterteilt werden können:
1. Bean eigene Methode: Dies schließt die von der Bean selbst berechneten Methoden und die durch das Init-Methoden und Destroy-Methoden in der Konfigurationsdatei angegebenen Methoden ein.
2. Methode auf Bean-Level-Lebenszyklus-Schnittstelle: Dies umfasst Grenzflächenmethoden wie BeannameAware, BeanFactoryAware, Initialisierungsbean und DipoSableBean
3.. Methode der Lebenszyklus-Schnittstelle auf Containerebene: Dies umfasst zwei Interface-Implementierungen: InstantiationArebeanPostProcessor und BeanPostProcessor. Ihre Implementierungsklasse wird allgemein als "Postprozessor" bezeichnet.
4. Factory Post -Processor Interface -Methode: Dies umfasst Aspektjweavenabler, ConfigurationClassPostProcessor, CustomAutoWireconFigurer und andere sehr nützliche Fabrik -Postprozessor -Schnittstellenmethoden. Fabrik-Postprozessoren sind ebenfalls Containerebene. Unmittelbar nach Anwendung der Konfigurationsdatei der Kontextbaugruppe angerufen.
3. Demo
Lassen Sie uns den Lebenszyklus der Frühlingsbohne mit einer einfachen Frühlingsbohne demonstrieren.
1. Zunächst einmal ist es eine einfache Frühlingsbohne, die die eigenen Methoden der Bean und die Methoden der Lebenszyklus auf Bean-Ebene nennt. Aus Gründen der Bequemlichkeit der Demonstration implementiert es vier Schnittstellen: Beannameaware, BeanFactoryAware, Initialisierungsbean und dipoSableBean. Gleichzeitig gibt es 2 Methoden, die der Init-Methode und dem Zerstören-Methoden von <Bean> in der Konfigurationsdatei entsprechen. wie folgt:
Paket Springbeantest; import org.springframework.beans.beansexception; import org.springframework.bean.factory.beanFactory; import org.springframework org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.initializingBean; private String -Adresse; privates Int -Telefon; private Beanfaktor -Beanfaktor; private String Beanname; public Person () {System.out.println ("【Konstruktor】 Call Person's Constructor Instantiation"); } public String getName () {return name; } public void setName (String -Name) {System.out.println ("【Injektionsattribut】 Injektionsattributname"); this.name = name; } public String getAddress () {Rückgabeadresse; } public void setAddress (String -Adresse) {System.out.println ("【Injektionsattribut】 Injektionsattributadresse"); this.address = Adresse; } public int getphone () {return telefon; } public void setPhone (int Telefon) {System.out.println ("【Injektionsattribut】 Injektionsattribut Telefon"); this.phone = Telefon; } @Override public String toString () {return "person [adress =" + adress + ", name =" + name + ", melphel =" + telefon + "]"; } // Dies ist die BeanfactoryAware -Schnittstellenmethode @Override public void setBeanFactory (beanfactory arg0) löscht beansexception {System.out .println ("【beanfactoryAware -Schnittstelle】 BeanfactoryAware.setbeanFactory ()"); this.beanfactory = arg0; } // Dies ist die BeannameaWare -Schnittstelle @Override public void setBeanname (String arg0) {System.out.println ("【BeannameAwary -Schnittstelle】 Aufrufen BeannameAware.setBeanname ()"); this.beAnname = arg0; } // Dies ist die initialisierungsbekische Schnittstellenmethode @Override public void AfterPertieStieSt () löst eine Ausnahme aus {System.out .println ("【Initialisierungs -Schnittstelle】 Aufruf initialisierungsbean.afterPropertieStieSt ()"); } // Dies ist die diposibleBean -Schnittstellenmethode @Override public void destroy () löst Ausnahme aus {System.out.println ("【diposibleBean -Schnittstelle】 diposibleBean.destory ()"); } // Initialisierungsmethode, die durch die Init-Method-Eigenschaft von <Bean> public void myInit () {System.out.println ("【init-Methode】 Aufrufen Sie die init-Methode-Eigenschaft von <Bean>") angegeben. } // Initialisierungsmethode, angegeben durch die Destroy-Methode-Eigenschaft von <Bean> public void myDestory () {System.out.println ("【Zerstören-Method】 Aufrufen Sie die in der Destroy-Method-Eigenschaft von <bean>") angegebene Initialisierungsmethode; }}2. Als nächstes muss die Methode der BeanPostPostProcessor -Schnittstelle wie folgt demonstrieren:
Paket Springbeantest; import org.springframework.beans.beansexception; import org.springframework.bean.factory.config.beanpostProcessor; System.out.println ("Dies ist der BeanPostProcessor -Implementierungsklassenkonstruktor !!"); // automatisch generierte Konstruktor-Stub} @Override öffentliches Objekt postprozessAfterinitialisierung (Objekt arg0, String arg1) löscht Beansexception {System.out .println ("BeanPostProcessor Interface-Methode Postprozessafterinitialisierung vor Änderungen an der Eigenschaft vor!"). kehren Arg0 zurück; } @Override öffentliches Objekt postProcessBeforeinitialisierung (Objekt arg0, String arg1) löst Beansexception aus {System.out .println ("BeanPostProcessor Interface -Methode postProcessBeforeInitialisierung verändert die Eigenschaft!"); kehren Arg0 zurück; }}Wie oben erwähnt, enthält die BeanPostProcessor -Schnittstelle zwei Methoden postprozessafteritialisiert und postprozessbeforialisiert. Der erste Parameter dieser beiden Methoden ist das zu verarbeitende Bean -Objekt, und der zweite Parameter ist der Name der Bean. Der Rückgabewert ist auch das zu verarbeitende Bean -Objekt. Achten Sie hier.
A. Im Allgemeinen erben wir die Adapter -Klasse -InstantiationArebeanPostPostProcessor -Adapter, die von Spring zur Verwendung erbracht wurde, wie folgt:
Paket Springbeantest; import Java.beans.PropertyDescriptor; import org.springframework.beans.beansexception; import org.springframework MyInstantiationAWareBeanPostProcessor erweitert die InstantiationArebeanPostPostProcessOradapter {public myInstantiationawarEbeanPostProcessor () {Super (); System.out .println ("Dies ist der InstanziationArebeanPostProcessoradapter -Implementierungsklassenkonstruktor !!"); } // rufen Sie @Override public Object postProcessBeforeinstantiation (Klasse beanclass, String beanname) Beansexception {System.out .println ("InstantiationAweAnaBeanPostProcessor -Aufrufe postProcessBeforen -Methode") aus. null zurückkehren; } // Schnittstellenmethode, rufen Sie @Override öffentliches Objekt postprozessafteritialisierung auf (Objektbean, String Beanname). Rückzahlung; } // rufen Sie @Override public PropertyValues postProcessPropertyValues (PropertyValues PVS, PropertyDescriptor [] PDS, Object Bean, String BeAnName aus. PVS zurückgeben; }}Dafür gibt es 3 Methoden, und die zweite Methode, die Postprozessafteritialisierung, besteht darin, die Methode des Beanpostprozessors neu zu schreiben. Die dritte Methode, PostProcessPropertyValues, wird verwendet, um Eigenschaften zu betreiben, und der Rückgabewert sollte auch ein Eigenschafts -Objekt sein.
V.
Paket SpringBeanTest; import org.springframework.beans.beansexception; import org.springframework.bean.factory.config.beandefinition; org.springframework.beans.factory.config.configurablelistableBeanFactory; öffentliche Klasse MybeanFactoryPostProcessor implementiert beanfactoryPostProcessor {public mybeanFactoryPostProcessor () {Super (); System.out.println ("Dies ist der BeanfactoryPostProcessor -Implementierungsklassenkonstruktor !!"); } @Override public void postProcessbeanFactory (configurableListableBeanFactory arg0) löst Beansexception aus {System.out .println ("beanfactoryPostProcessor -Aufrufe postProcessbeanFactory -Methode"); BeanDefinition bd = arg0.getbeandefinition ("Person"); Bd.getPropertyValues (). AddPropertyValue ("Telefon", "110"); }}5. Die Konfigurationsdatei lautet wie folgt beans.xml, was sehr einfach ist. Bei Verwendung von ApplicationContext muss der Prozessor nicht manuell registriert werden:
<? xmlns: p = "http://www.springframework.org/schema/p" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.spingrameWramework XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <Bean id = "Beanpostprozessor"> </bean> <Bean> <Bean id = " id = "InstantiationAwarebeanPostProcessor"> </bean> <bean id = "BeanfactoryPostProcessor"> </bean> <bean id = "Person" init-Methode = "myInit" -Methode = "mydestory" scope = "Singleton" p: name = "zhang san00" p: p: p: p: address = "Guangzhou" p: "p:" zhang san00 "p: p. /> < /beans>
6. Testen Sie Folgendes:
Paket SpringBeantest; import org.springframework.context.ApplicationContext; org.springframework.context.support.classPathxMlapplicationContext; öffentliche Klasse Beanlifecycle {public static void main (String [] args). ApplicationContext factory = new classPathXmlApplicationContext ("Springbeantest/beans.xml"); System.out.println ("Containerinitialisierung erfolgreich"); // Holen Sie sich Preson und verwenden Sie Person Person = factory.getbean ("Person", Person.class); System.out.println (Person); System.out.println (Person); System.out.println ("Starten Sie jetzt den Container!"); ((ClassPathXMLApplicationContext) Fabrik) .RegisterShutDownhook (); }}Schließen Sie den Container mit der Hakenmethode, die tatsächlich abstractApplicationContext ist.
Schauen wir uns die Ergebnisse an:
Beginnen Sie mit dem Container jetzt 2014-5-18 15:46:20 org.springFramework.context.support.AbstractApplicationContext PreparereFresh Informationen: Aktualisieren org.springframework.context.support.classpathxmlaplicationContext@19a0C7C: Startup: Startup Date [Sun. Wurzel des Kontextes Hierarchy2014-5-18 15:46:20 org.springFramework.bean.factory.xml.xmlbeandefinitionReader loadbeandefinitions Informationen: Laden XML Bean Definitionen aus Klassenpfadressourcen [SpringbeanTest/Beans.xml. ! BeanfactoryPostProcessor ruft PostProcessbeanFactory -Methode auf. Dies ist der BeanPostProcessor -Implementierungsklassenkonstruktor! ! Dies ist der Implementierungsklassenkonstruktor der InstantiationAweanPostPostProcessoradapter! ! 2014-5-18 15:46:20 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletonsInformation: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9934d4: defining beans [BeanPostProcessor, InstantiationArebeanPostProcessor, BeanfactoryPostProcessor, Person]; Wurzel der fabrikhierarchyinstantiationawarebeanPostProcessor ruft Postprozessbeerstantiationsmethode auf. Schnittstelle] Aufruf beAnNameAware.setbeAnname () [BeanFactoryAware -Schnittstelle] Aufrufen BeanFactoryAWare.setbeanFactory () BeanpostProcessor Interface -Methode PostprocessBeforeInitialisierung verändert das Attribut! [InitializingBean-Schnittstelle] Initialisierungsbean.afterPropertieStieSet () [init-Methode] Aufrufen Sie die Initialisierungsmethode, die durch die Init-Methode-Eigenschaft von <Bean>, BeanPostProcessor Interface-Methode, postprozessafteritialisierung, um die Eigenschaft zu ändern! Die InstantiationAwarebeanPostProcessor nennt die Postprozessafteritialisierungsmethode. Der Behälter wird erfolgreich initialisiert. Person [Adresse = Guangzhou, Name = Zhang San, Telefon = 110] Beginnen Sie jetzt, den Container zu schließen! 【DostibleBean-Schnittstelle】 Call DiposibleBean.Destory () 【Zerstören-Methode】 Rufen Sie die in der Destroy-Methoden-Eigenschaft von <bean> angegebene Initialisierungsmethode auf
Das obige ist eine Zusammenstellung der Informationen zum Lebenszyklus der Java -Frühlingsbohne. Wir werden in Zukunft weiterhin relevante Informationen hinzufügen. Vielen Dank für Ihre Unterstützung für diese Website!