Sebagai kerangka kerja ringan yang paling populer dan kuat di Java, Spring telah disambut dengan hangat oleh programmer. Sangat penting untuk secara akurat memahami siklus hidup kacang musim semi. Kami biasanya menggunakan ApplicationContext sebagai Container Spring. Di sini, kita juga berbicara tentang siklus hidup kacang di ApplicationContext. Faktanya, BeanFactory serupa, tetapi prosesor perlu didaftarkan secara manual.
1. Bagan Aliran Siklus Hidup:
Siklus hidup penuh kacang musim semi dimulai dengan membuat wadah musim semi sampai wadah musim semi akhirnya menghancurkan kacang, yang berisi serangkaian poin penting.
Jika wadah mendaftarkan berbagai antarmuka di atas, program akan dilakukan sesuai dengan proses di atas. Fungsi setiap antarmuka akan dijelaskan secara rinci di bawah ini.
2. Klasifikasi berbagai metode antarmuka
Siklus hidup penuh kacang mengalami berbagai panggilan metode, yang dapat dibagi menjadi kategori berikut:
1. Metode Bean sendiri: Ini termasuk metode yang disebut kacang itu sendiri dan metode yang ditentukan melalui metode init dan destroy-method dalam file konfigurasi.
2. Metode Antarmuka Siklus Hidup Level Level: Ini termasuk metode antarmuka seperti beannameaware, beanfactoryAware, initializingBean dan DipoSableBean
3. Metode Antarmuka Siklus Hidup Tingkat Kontainer: Ini termasuk dua implementasi antarmuka: InstantiationAwarebeanPostProcessor dan BeanpostProcessor. Kelas implementasi mereka umumnya disebut "postprocessor".
4. Metode antarmuka postprocessor pabrik: Ini termasuk aspekjweavingenabler, configurationclasspostprocessor, customAutowireconfigurer dan metode antarmuka postprocessor pabrik yang sangat berguna lainnya. Post-Processor Pabrik juga merupakan tingkat kontainer. Dipanggil segera setelah menerapkan file konfigurasi perakitan konteks.
3. Demo
Mari kita tunjukkan siklus hidup kacang musim semi dengan kacang musim semi sederhana.
1. Pertama-tama, ini adalah kacang musim semi yang sederhana, yang menyebut metode Bean sendiri dan metode antarmuka siklus hidup tingkat kacang. Demi kenyamanan demonstrasi, ini mengimplementasikan empat antarmuka: beannameaware, beanfactoryAware, initializingbean dan diposableBean. Ada 2 metode pada saat yang sama, sesuai dengan metode init dan hancur <bean> dalam file konfigurasi. sebagai berikut:
Paket Springbeantest; Impor org.springframework.beans.beansException; impor org.springframework.beans.factory.beanfactory; impor org.springframework.beans.factory.beanfactoryAware; impor org.springframework.beanfactory org.springframework.beans.factory.disposablean; impor org.springframework.beans.factory.initializingBean;/** * @author qsk */orang kelas publik mengimplementasikan name beanfactoryAware, beannameaware, initializeBean, DisposableBean {private {name private, beannameaware, initializeBean, DisposableBean {private {name private, beannameaware, initializeBean, DisposableBean {private {name private; alamat string pribadi; telepon int pribadi; Private Beanfactory Beanfactory; Private String Beanname; orang publik () {System.out.println ("【Konstruktor】 Instantiasi Konstruktor Person"); } public string getName () {return name; } public void setName (nama string) {System.out.println ("【Atribut Injeksi】 Nama atribut injeksi"); this.name = name; } public String getAddress () {alamat kembali; } public void setAddress (Alamat String) {System.out.println ("【Atribut Injeksi】 Alamat Atribut Injeksi"); this.address = alamat; } public int getPhone () {return phone; } public void setPhone (int phone) {System.out.println ("【Atribut Injeksi】 Telepon Atribut Injeksi"); this.phone = telepon; } @Override Public String ToString () {return "person [address =" + address + ", name =" + name + ", phone =" + phone + "]"; } // Ini adalah metode interface beanfactororyAware @Override public void setBeanFactory (beanfactory arg0) melempar beansexception {System.out .println ("【antarmuka beanfactoryAware】 call beanfactoryAware.setbeanfactory ()"); this.beanFactory = arg0; } // Ini adalah metode antarmuka beannameaware @Override public void setBeanName (String arg0) {System.out.println ("【antarmuka beannameaware】 panggilan beannameaware.setBeanName ()"); this.beanName = arg0; } // Ini adalah metode inisialisasi antarmuka @Override public void afterpropertiesset () melempar Exception {System.out .println ("【Inisialisasi Antarmuka】 Call InitializingBean.AfterPropertiesset ()"); } // Ini adalah metode antarmuka dipoSibleBean @Override public void destroy () melempar Exception {System.out.println ("【Antarmuka DipoSibleBean】 Call DipoSibleBean.Destory ()"); } // Metode inisialisasi yang ditentukan melalui properti init-Method <bean> public void myInit () {System.out.println ("【init-Method】 Panggil metode inisialisasi yang ditentukan oleh properti init-metod dari <ean>"); } // Metode inisialisasi yang ditentukan oleh properti destroy-metodik <bean> public void mydestory () {System.out.println ("【Destroy-Method】 Panggil metode inisialisasi yang ditentukan oleh properti hancur-metode <bean>"); }}2. Berikutnya adalah untuk menunjukkan metode antarmuka beanpostprocessor, sebagai berikut:
package springBeanTest;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor { public MyBeanPostProcessor() { super(); System.out.println ("Ini adalah konstruktor kelas implementasi beanpostprocessor !!"); // TODO Stub Konstruktor yang Dihasilkan Otomatis} @Override Objek publik PostProcessAntInitialization (objek arg0, string arg1) melempar BeansException {System.out .println ("Metode antarmuka beanpostprocessor postprocessafterinitialisasi membuat perubahan pada properti!"); mengembalikan arg0; } @Override Objek publik PostProcessBeforeInitialization (objek arg0, string arg1) melempar BeansException {System.out .println ("Metode antarmuka beanpostprocessor postprocessBeforeInitialisasi mengubah properti!"); mengembalikan arg0; }}Seperti disebutkan di atas, antarmuka beanpostprocessor mencakup dua metode postprocessafterinitialisasi dan postprocessBeforeInitialisasi. Parameter pertama dari kedua metode ini adalah objek kacang yang akan diproses, dan parameter kedua adalah nama kacang. Nilai pengembalian juga merupakan objek kacang yang akan diproses. Perhatikan di sini.
3. Antarmuka InstantiationAwarebeanPostProcessor pada dasarnya adalah subinterface dari beanpostprocessor. Secara umum, kami mewarisi adaptor adaptor adaptor adaptor adaptor yang disediakan oleh Spring untuk menggunakannya, sebagai berikut:
Paket Springbeantest; Impor java.beans.propertydescriptor; impor org.springframework.beans.beansException; impor org.springframework.beans.propertyvalues; impor org.springframework.beans.factory.config.instantiasionwareWareWareWareWareWareBeArporess.beans.factory.config.sonfig.instantiasiasiwareAwareWareWareWareBarbeArporyory MyInstantiationAwarebeanPostProcessor memperluas InstantiationAwarebeanPostProcessorAdapter {public myInstantiationAwarebeanPostProcessor () {super (); System.out .println ("Ini adalah konstruktor kelas InstantiationAwareBeanPostProcessorAdapter !!"); } // hubungi @Override Objek publik postprocessBeforeInstantiation (kelas beansclass, string beanname) melempar beansException {System.out .println ("Metode InstantiationAwareBeanPostProcessor PostprocessBeforeIninSantiation"); kembali nol; } // Metode antarmuka, hubungi @Override Objek publik PostProcessAfterInitialization (Object Bean, String Beanname) melempar BeansException {System.out .println ("Metode InstantiationAwareBeanPostProcessor Postprocessafterinitialization"); Kembalikan kacang; } // hubungi @Override Public PropertyValues PostProcessPropertyValues (PropertyValues PVS, PropertyDescriptor [] PDS, Object Bean, String Beanname) Melempar BeansEsException {System.out .Println ("InstantiationAwareBeanPostProcessor Panggilan PostProcessessor; mengembalikan PVS; }}Ada 3 metode untuk ini, dan metode kedua, postprocessafterinitialisasi, adalah menulis ulang metode beanpostprocessor. Metode ketiga, PostProcessPropertyValues, digunakan untuk mengoperasikan properti, dan nilai pengembalian juga harus menjadi objek nilai properti.
4. Mendemonstrasikan metode antarmuka postprocessor pabrik, sebagai berikut:
Paket Springbeantest; Impor org.springframework.beans.beansException; impor org.springframework.beans.factory.config.beandefinition; impor org.springframework.beans.factory.config.beanfactoryPostprocessor; impor; org.springframework.beans.factory.config.configurablelistableBeanFactory; kelas publik myBeanFactoryPostPessor mengimplementasikan beanfactorypostprocessor {public mybeanfactorypostprocessor () {super (); System.out.println ("Ini adalah konstruktor kelas implementasi BeanFactoryPostProcessor !!"); } @Override public void postprocessBeanFactory (configurableListableBeanFactory arg0) melempar BeansException {System.out .println ("BeanFactoryPostProcessor menyebut metode postprocessBeanFactory"); Beandefinition bd = arg0.getBeandefinition ("orang"); bd.getPropertyValues (). AddPropertyValue ("Telepon", "110"); }}5. File konfigurasi adalah sebagai berikut beans.xml, yang sangat sederhana. Saat menggunakan ApplicationContext, prosesor tidak perlu terdaftar secara manual:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: p = "http://www.springframework.org/schema/p" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http:/schema.org.sok.gwork.org.gwork.org.org.org.org.org.org.org.sework.org.org.org.gework.org.org.org.gework.org.org.org.org.org.org.gework.org.orgad XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring--3.2.xsd"> <bean id = "beanpostpostpring"> </iDawean "> <bean id =" beanpostpostprocessor "> </IDean"> <bean id = "beanpostpostprocessor"> </IDean "> <bean id =" beanpostpostprocessor "> </IDean"> <beaning " </bean> <bean id = "beanfactorypostprocessor"> </tact> <bean id = "orang" init-metod = "myInit" dash-method = "mydestory" scope = "singleton" p: name = "zhang san" p: "guangzhou" p: telepon = "15900000000000000000000" P: "GUANGZHOU" P: TELEPON = "159000000000000000000000000000000"
6. Uji berikut:
Paket Springbeantest; impor org.springframework.context.applicationContext; impor org.springframework.context.support.classpathxmlapplicationContext; class public beanlifecycle {public static Main (string [] args) {System.out.printlcle {public static Main (String [] args) {System.out.prinning ApplicationContext factory = new ClassPathXMLapPlicationContext ("SpringBeantest/Beans.xml"); System.out.println ("Inisialisasi Wadah berhasil"); // Dapatkan preson dan gunakan orang orang = factory.getbean ("orang", orang.class); System.out.println (orang); System.out.println (orang); System.out.println ("Mulai tutup wadah sekarang!"); ((ClasspathxmlapplicationContext) pabrik) .registershutdownhook (); }}Tutup wadah menggunakan metode hook yang sebenarnya abstractApplicationContext.
Mari kita lihat hasilnya:
Start initializing the container now 2014-5-18 15:46:20 org.springframework.context.support.AbstractApplicationContext prepareRefresh information: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@19a0c7c: startup date [Sun May 18 15:46:20 CST 2014]; root of context hierarchy2014-5-18 15:46:20 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions information: Loading XML bean definitions from class path resource [springBeanTest/beans.xml] This is the BeanFactoryPostProcessor implementation class constructor! Lai BeanFactoryPostProcessor Metode PostprocessBeanFactory Ini adalah konstruktor kelas implementasi beanpostprocessor! Lai Ini adalah konstruktor kelas implementasi InstantiationAwareBeanPostProcessorAdapter! Lai 2014-5-18 15:46:20 org.springframework.beans.factory.support.defaultListableBeanFactory preinstantibiesingEnTonformation: pre-instantionating singleton di org.springframework.beans.factory.support.supportAnsableAndable [BeanpostProcessor, InstantiationAwarebeanPostProcessor, BeanfactoryPostProcessor, orang]; Root of Factory HierarchySantiationAwareBeanPostProcessor menyebut metode postprocessbeforeInstantiation [konstruktor] memanggil konstruktor orang InstantiationAwareBeanPostProcessor memanggil Atribut PostProcessPropertyNUES [Lamban Lamban] Atribut Lambung Langsung [Suntung Atribut Suntung Atribut [Suntikan Atribut Suntung Atribut Langsung [Menyuntikkan Atribut Suntikan [Suntikan Atribut Suntikan Atribut [Suntung Lambu Lambu Langsung [Menyuntikkan Atribut Suntikan [Menyuntikkan Atribut Langsung [Menyuntikkan Atribut Suntikan [Menyuntikkan Atribut Langsung [Menyuntikkan Atribut Suntikan [Menyuntikkan Atribut Langsung. Beannameaware.setBeanName () [antarmuka beanfactoryAware] memanggil beanfactoryAware.setBeanfactory () metode antarmuka beanpostprocessor postprocessBeforeInitialization mengubah atribut! [InitializeBean Interface] Call InitializeBean.AfterPropertiesset () [init-Method] Panggilan metode inisialisasi yang ditentukan oleh properti init-metodik dari <Bean>, metode antarmuka beanpostprocessor postprocessafterinitialisasi untuk mengubah properti! InstantiationAwarebeanPostProcessor menyebut metode postprocessafterinitialisasi. Wadah ini berhasil diinisialisasi. Orang [alamat = guangzhou, name = zhang san, telepon = 110] Sekarang mulai menutup wadah! 【Antarmuka dostibleBean】 Panggilan DipoSibleBean.destory () 【Destroy-Method】 Panggilan metode inisialisasi yang ditentukan oleh properti kehancuran-metode <bean>
Di atas adalah kompilasi dari informasi tentang siklus hidup kacang musim semi Java. Kami akan terus menambahkan informasi yang relevan di masa mendatang. Terima kasih atas dukungan Anda untuk situs ini!