Javaで最も人気のある強力な軽量フレームワークとして、Springはプログラマーに温かく歓迎されています。 Spring Beanのライフサイクルを正確に理解することが非常に必要です。通常、ApplicationContextをスプリングコンテナとして使用します。ここでは、ApplicationContextの豆のライフサイクルについても話しています。実際、BeanFactoryは似ていますが、プロセッサを手動で登録する必要があります。
1。ライフサイクルフローチャート:
スプリングビーンの完全なライフサイクルは、スプリングコンテナが最終的に一連のキーポイントを含む豆を破壊するまで、スプリングコンテナを作成することから始まります。
コンテナが上記のさまざまなインターフェイスを登録する場合、プログラムは上記のプロセスに従って実行されます。各インターフェイスの関数については、以下で詳しく説明します。
2。さまざまなインターフェイスメソッドの分類
Beanの完全なライフサイクルは、さまざまなメソッド呼び出しを受けます。これは、次のカテゴリに分類できます。
1。Bean独自の方法:これには、Bean自体によって呼び出される方法と、構成ファイルのinit-methodおよびDestroy-methodを通じて指定された方法が含まれます。
2。Bean-Level Life Cycle Interface Method:これには、Beannameaware、BeanFactoryAware、InitializingBean、DiposableBeanなどのインターフェイスメソッドが含まれます
3。コンテナレベルのライフサイクルインターフェイス方法:これには、InstantiationAwarebeanPostProcessorとBeanPostProcessorの2つのインターフェイスの実装が含まれます。それらの実装クラスは、一般に「ポストプロセッサ」と呼ばれます。
4。ファクトリポストプロセッサインターフェイス方法:これには、AspectJWeavingEnabler、ConfigurationClassPostProcessor、CustomAutowireConFigurer、およびその他の非常に有用な工場ポストプロセッサインターフェイスメソッドが含まれます。工場のポストプロセッサもコンテナレベルです。コンテキストアセンブリ構成ファイルを適用した直後に呼び出されます。
3。デモ
シンプルなスプリングビーンでスプリングビーンのライフサイクルを示しましょう。
1.まず第一に、それはビーンのメソッドとビーンレベルのライフサイクルインターフェイス法を呼び出すシンプルなスプリングビーンです。デモンストレーションの便利さのために、Beannameaware、BeanFactoryAware、InitializingBean、DiposableBeanの4つのインターフェイスを実装しています。構成ファイルの<bean>のinit-methodとdestroy-methodに対応する2つの方法が同時にあります。次のように:
パッケージSpringBeanTest; Import org.springframework.beans.beansexception; import org.springframework.beans.factory.beanfactory; Import org.springframework.factory.beanfactoryaware; Import org.springframework.beans.factory.beannameaware; org.springframework.beans.factory.disposablebean; import org.springframework.beans.factory.initializingbean;/** * @author qsk */public class perse emplesement beanfactoryaware、beannameaware、initializingbean、daproableablebean {private string name;プライベート文字列アドレス。プライベートINT電話; Private BeanFactory BeanFactory;プライベートストリングbeanName; public Person(){system.out.println( "【コンストラクターcall担当者のコンストラクターのインスタンス化"); } public string getname(){return name; } public void setName(string name){system.out.println( "【インジェクション属性】インジェクション属性名"); this.name = name; } public string getAddress(){return Address; } public void setAddress(string address){system.out.println( "【インジェクション属性】インジェクション属性アドレス"); this.address = address; } public int getPhone(){return phone; } public void setPhone(int phone){System.out.println( "【インジェクション属性】インジェクション属性電話"); this.phone = phone; } @Override public String toString(){return "person [address =" + address + "、name =" + name + "、phone =" + phone + "]"; } //これはbeanfactoryawareインターフェイスメソッド@override public void setbeanfactory(beanfactory arg0)throws beansexception {system.out .println( "【beanfactoryawareインターフェイス】呼び出しbeanfactoryaware.setbeanfactory()"); this.beanfactory = arg0; } //これはBeannameawareインターフェイスメソッド@Override public void setBeanName(String arg0){System.out.println( "【beannameaware.setbeanname()"); this.beanname = arg0; } //これはInitializingBean Interface Method @Override public void abuldPropertiesset()をスロー{system.out .println( "【initializingbean interface】intialitybean.afterpropertiesset()"); } //これはdiposiblebean interface method @override public void destroy()throws exception {system.out.println( "【diposiblebean interface】diposiblebean.destory()"); } // <bean> public void myInit(){system.out.println( "init-method】<bean>")によって指定された初期化メソッドを呼び出す<bean> public void myinit(){system.out.printodの初期化メソッド; } // <bean> public void mydestory(){system.out.println( "【destroy-method】<bean>")の破壊メソッドプロパティによって指定された初期化方法を呼び出す<bean> public void mydestory( ") }}2。次は、次のように、BeanPostProcessorインターフェイスの方法を実証することです。
パッケージSpringBeanTest; Import org.springframework.beans.beansexception; Import org.springframework.beans.factory.config.beanPostprocessor; Public Class MyBeanPostProcessorはBeanPostProcessor {public MyBeanPostprocessor(){Super(); system.out.println( "これはbeanpostprocessor実装クラスコンストラクター!!"); // TODO自動生成コンストラクタースタブ} @OverrideパブリックオブジェクトPostProcessafterInitialization(Object Arg0、String Arg1)Throws BeanSexception {system.out .println( "beanpostprocessor interfaceメソッドポストプロセッアフテレイティアル化は、プロパティに変更を加えます!"); arg0を返します。 } @Override public Object postprocessbeforeInitialization(object arg0、string arg1)beansexception {system.out .println( "beanpostprocessor interfaceメソッドポストプロセスの前面化の変化!"); arg0を返します。 }}上記のように、BeanPostProcessorインターフェイスには、プロセッサフテテリティアル化後の2つの方法とプロセス後の前の2つの方法が含まれています。これらの2つの方法の最初のパラメーターは、処理されるBeanオブジェクトであり、2番目のパラメーターはBeanの名前です。返品値は、処理されるBeanオブジェクトでもあります。ここで注意してください。
3. InstantiationAwareBeanPostprocessorインターフェイスは、基本的にBeanPostProcessorのサブインターフェイスです。一般的に、次のように、Springが提供するためにSpringが提供するAdapterクラスのインスタンスアワレビアンポストプロセッサアダプターを継承します。
パッケージSpringBeanTest; Import Java.Beans.PropertyDescriptor; Import org.springframework.beans.beanseception; Import org.springframework.beans.propertyvalues; Import org.sspringframework.beans.factory.config.instantationatiationawarebeanpostprocestrosedapter; myInstantiationAwarebeanpostprocessorは、instantiationawarebeanpostprocessoradapterを拡張します{public myInstantiationAwarebeanpostprocessor(){super(); system.out .println( "これはInstantiationAwarebeanpostprocessoradapter実装クラスコンストラクター!!"); } // @Override public Object postprocessbeforeinstantiation(class beanclass、string beanname)throws beansexception {system.out .println( "instantiationawarebeanpostprocessor call call postprocessbeforeinstantiation method"); nullを返します。 } //インターフェイスメソッド、@Override public Object postprocessafterinitialization(object bean、string beanname)を呼び出すbeansexception {system.out .println( "instantiatiationawarebeanpostprocessor call call postprocessafterinitialization method");豆を返します。 } // Call @Override public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { System.out .println("InstantiationAwareBeanPostProcessor calls postProcessPropertyValues method"); PVSを返します。 }}これには3つの方法があり、2番目の方法であるプロセッサフテリテーション化後の方法は、beanpostprocessorの方法を書き直すことです。 3番目の方法であるPostProcessPropertyValuesは、プロパティの操作に使用され、戻り値もプロパティ値オブジェクトである必要があります。
4.次のように、工場のポストプロセッサインターフェイス法を実証します。
パッケージspringbeantest; Import org.springframework.beans.beansexception; Import org.springframework.beans.factory.config.beandefinition; Import org.springframework.beans.config.beanfactorypostprocessor; Import; org.springframework.beans.factory.config.configurablelistablebeanfactory; public class mybeanfactorypostprocessorを実装するbeanfactorypostprocessor {public mybeanfactorypostprocessor(){super(); System.out.println( "これはBeanFactoryPostProcessor Class Constructor !!"); } @Override public void postprocessbeanfactory(configureablElistablebeanFactory arg0)throws beansexception {system.out .println( "beanfactorypostprocessor calls postprocessbeanfactory method"); beandefinition bd = arg0.getBeanDefinition( "person"); bd.getPropertyValues()。addPropertyValue( "Phone"、 "110"); }}5.構成ファイルは次のようにbeans.xmlです。これは非常に簡単です。 ApproachContextを使用する場合、プロセッサを手動で登録する必要はありません。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:p = "http://www.springframework.org/schema/p" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework. xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id = " id = "InstantiationAwareBeanPostProcessor"> </bean> <bean id = "beanfactorypostprocessor"> </bean> <bean id = "person" init-method = "myinit" Destroy-method = "mydestory" scope = "singleton" p:name = "Zhang san /> < /beans>
6.以下をテストしてください。
パッケージSpringBeanTest; Import org.springframework.context.applicationContext; Import org.springframework.context.support.classpathxmlapplicationcontext; public class beanlifecycle {public static void main(string [] args){system.out.out.out.outln( "in" ApplicationContext Factory = new ClassPathXMLApplicationContext( "SpringBeanTest/Beans.xml"); System.out.println( "コンテナ初期化に正常に"); //プリソンを取得して人を使用します= factory.getBean( "person"、person.class); System.out.println(person); System.out.println(person); system.out.println( "今すぐコンテナを閉じます!"); ((classpathxmlapplicationContext)Factory).registershutdownhook(); }}実際にAbstractApplicationContextであるフックメソッドを使用してコンテナを閉じます。
結果を見てみましょう:
今すぐコンテナの初期化を開始2014-5-18 15:46:20 org.springframework.context.support.abstractapplicationcontext preparerefresh情報:regning org.springframework.context.support.classpathxmlapplicationcontext@19a0c7c:startupport.springupport.pristupコンテキストのルート階層のルート2014-5-18 15:46:20 org.springframework.beans.factory.xml.xml.xml.xml.definitionReader loadbeandefinitions情報:クラスパスリソースからのXMLビーン定義[SpringBeanTest/Beans.xml] ! BeanFactoryPostProcessorは、PostProcessBeanFactoryメソッドを呼び出し、これがBeanPostProcessorの実装クラスコンストラクターです! !これは、InstantiationAwareBeanPostProcessorAdapterの実装クラスコンストラクターです! ! 2014-5-18 15:46:20 org.springframework.beans.factory.support.defaultlistablebeanfactory preintantiatesingletonsinformation:org.springframework.beans.factory.support.defaultable listablebeanfactory@factoryfactoryfactoryfactoryfactoryfactory [beanpostprocessor、instantiationawarebeanpostprocessor、beanfactorypostprocessor、person];工場階層の根元の根の根の根の根は、ポストプロセスの前にポストプロセッサの根性装置の前にコールパーソンのコンストラクターのインスタンスアウェアビアンポストプロセッサコールポストプロセスプロパティバリューメソッド[属性を注入]属性アドレスを注入する[属性属性]属性名[Beanmalmay属性属性]を呼び出す[Beanmand属性属性]属性属性アドレスの呼び出しを呼び出しますbeannameaware.setBeanName()[BeanFactoryAwareインターフェイス] Calling BeanFactoryAware.SetBeanFactory()BeanPostProcessor Interface Methodプロセス後の前面化後の属性が変更されます! [InitializingBean Interface] InitializingBean.afterPropertiesset()[init-method] [init-method] <bean>のinit-methodプロパティで指定された初期化メソッドを呼び、プロセッサフテテル化後のbeanpostprocessorインターフェイスメソッドのプロパティを変更してください! InstantiationAwareBeanPostprocessorは、ポストプロセッアフテレイニティアル化法を呼び出します。コンテナは正常に初期化されます。人[住所=広州、name = Zhang San、電話= 110]がコンテナの閉鎖を開始します! dostiblebeanインターフェイス】呼び出しdiposiblebean.destory()
上記は、Java Spring Beanのライフサイクルに関する情報の編集です。今後も関連情報を追加し続けます。このサイトへのご支援ありがとうございます!