Spring Beanのライフサイクルは、春の綿密な研究のための基礎ですが、また難しい、この記事では、春の豆のライフサイクルの結論を説明するために、コード+グラフィックな方法を使用します、
この記事は明らかに下の図を説明します。
プロジェクト構造とソースコード
1.ディレクトリ構造
2.applicationContext.xml
<?XMLバージョン= "1.0"エンコード= "UTF-8" ?> < 豆のxmlns = "http://www.springframework.org/schema/beans" のxmlns:XSI = "http://www.w3.org/2001 / XMLスキーマ・インスタンス" のxsi:のschemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > < ビーンクラス=" COM .demo.dao.UserDao」ID = "userDao" スコープ= "シングルトン" INIT-方法= "myInit" 破壊法= "myDestroy" > </> </ ビーン> < ビーンクラス= "com.demo.dao.MyBeanPostProcessor" ID = "myBeanPostProcessor" /> </ 豆>
3.UserDao.java
パッケージcom.demo.dao。 輸入org.springframework.beans.BeansException。 輸入 org.springframework.beans.factory *。; 輸入org.springframework.beans.factory.config.BeanPostProcessor。 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.ApplicationContextAware。 輸入org.apache.log4j.Logger。 パブリック クラス UserDaoは実装BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean、 DisposableBean { プライベート文字列のユーザ名を、 プライベート int型のカウント= 0 ; パブリック文字列、getUserName(){ 戻りユーザ名; } // 2.プロパティ注射、注入性は、ユーザ名です 公共 ボイドsetUserName(文字列のuserName){ COUNT ++ ; のSystem.out.println(COUNT + ":=プロパティを注入userNameに" + userNameに); この .userNameは= ユーザー名; } // インスタンス化するとき、コンストラクタを呼び出すための引数なしで1コンストラクタ パブリックUserDaoを(){ COUNT ++ ; のSystem.out.println(COUNT +「:UserDaoはコンストラクタを呼び出します() " ); } // 3. ID豆得るBeanNameAwareを実現 公共 ボイドsetBeanName(文字列S){ COUNT ++ ; のSystem.out.println(COUNT + ":setBeanName()はID豆、豆ID =取得呼び出し" + Sを); } // 4.ビーンファクトリー得、BeanFactoryAwareを実現 公共 ボイド setBeanFactoryを(たBeanFactoryたBeanFactory)はスローBeansException { COUNT ++を、 するSystem.out.println(COUNT +:+ "setBeanFactory()の呼び出しはマメ植物、たBeanFactory =取得" たBeanFactory); } // 5.取得ApplicationContextAwareを実装し、Beanコンテキスト 公共 ボイド setApplicationContextを(ApplicationContextのApplicationContextの)がスロー BeansExceptionを{ COUNTを++ ; のSystem.out.println(COUNT + "のApplicationContext =、setApplicationContext()はBeanコンテキストを取得呼び出し" + のApplicationContext); } // afterPropertiesSet得、InitializingBeanを実装6 公共 ボイド afterPropertiesSet()がスロー例外{ COUNTを ++ 。 System.out.println(COUNT + ":afterPropertiesSet()を呼び出し" ); } // 7カスタム初期化メソッドMyInit() 公共 ボイドMyInit(){ COUNT ++ ; のSystem.out.println(COUNT +「:コールカスタムMyInit() "); } // 8. DisposableBeanを達成するため、)(破壊を取得 公共 ボイドを破壊()スロー例外{ COUNT ++ ; のSystem.out.println(COUNT + ":破壊()" ); } // 9破壊カスタムmyDestroyの方法を() 公共 ボイドmyDestroy(){ COUNT ++ ; System.out.printlnは(COUNT + ":カスタム破壊()を呼び出します" ); } }
4.MyBeanPostProcessor.java
パッケージcom.demo.dao。 輸入org.springframework.beans.BeansException。 輸入org.springframework.beans.factory.config.BeanPostProcessor。 パブリック クラス MyBeanPostProcessorは実装BeanPostProcessor { パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーン、文字列のbeanName)がスローBeansException { するSystem.out.println( "=====调用postProcessBeforeInitialization()=====を" )。 リターン豆。 } パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)がスロー BeansExceptionを{ するSystem.out.printlnを("=====调用postProcessAfterInitialization()=====" )。 リターン豆。 } }
2つのテストコードとテスト結果
1.test.java
パッケージcom.demo.test。 輸入com.demo.dao.UserDao。 輸入org.junit.Test; 輸入org.springframework.context.support.AbstractApplicationContext; 輸入org.springframework.context.support.ClassPathXmlApplicationContext; パブリック クラスのMyTest { @Test 公共 ボイドテスト(){ // 初始化并定义容器 // のApplicationContextのApplicationContext =新ClassPathXmlApplicationContext( "applicationContext.xmlを"); AbstractApplicationContextのApplicationContext = 新 ClassPathXmlApplicationContext( "applicationContext.xmlを"); applicationContext.getBean(UserDaoにクラス); // 密閉容器であって、メソッドが呼び出される破壊する )applicationContext.registerShutdownHook(; } }
2.試験結果
三つの分析
次のように上記の試験結果と、豆のライフサイクルプロセスです。
1.組立豆
豆のライフサイクルの最初の部分のための豆のアセンブリ。いわゆる豆アセンブリ、豆Javaオブジェクトを変換するプロセスを指します。この例では、UserDao.jave及び豆にMyBeanPostProcessorのXML方法。
注:XMLの実施形態では、Javaのコードの実施形態では、自動組立および混合アセンブリ方法:スプリング取付フレームは、4つの方法豆をサポート
2.ロードおよびインスタンス化applicationContext.xmlを
ロードされ、インスタンス化豆豆は、ライフサイクルの2番目の部分です。待つことなくBeanがシングルトンである場合、このプロセスは、オブジェクトをインスタンス化され、ロードするClassPathXmlApplicationContextにより本明細書に例示される()と
applicationContext.getBean()プロトタイプが同じではないオブジェクトをインスタンス化するときに豆を取得を呼び出します。
3. [プロパティインジェクション
豆のライフサイクル第三の態様では、反射モード噴射Beanの注入Beanプロパティ。
4.実現BeanNameAware、取得ビーンID
手順は、Beanのライフサイクルの第一部であり、インターフェースを実装するには、豆のIDを取得することができます
5.豆植物を得、BeanFactoryAwareを実装
手順はBeanFactoryAwareを実施することによって取得された豆、豆植物のライフサイクルの第五の一部であります
6. ApplicationContextAwareを実装し、使用するコンテキストを取得
该过程为bean生命周期第六环节,通过实现ApplicationContextAware接口,获取bean上下文
7.调用Bean后置处理器,before
该过程为bean生命周期第七环节,通过实现后置处理器BeanPostProcessor获取before和after,该过程是通过AOP方式实现的,在before和after之间,发生如下8,9过程。
8.实现InitializingBean的afterPropertiesSet(),获取初始化方法
该过程为bean生命周期第八环节,通过实现InitializingBean,获取afterPropertiesSet()
9.调用自定义初始化方法,init-method
该过程为bean生命周期第九环节,实现自定义初始化方法
10.调用Bean后置处理器after
该过程为bean生命周期第十环节,后置处理器最后环节
11.关闭容器AbstractApplicationContext.registerShutDownHook()
该环节为bean生命周期第十一环节,关闭容器
12.调用DisposableBean的destroy()
该过程为bean生命周期第十二环节,实现DisposableBean接口,调用destroy()
13.调用定制化销毁方法destroy-method
该过程为bean生命周期最后环节,调用自定义销毁方法destroy-method
三 版权区
- 转载博客,必须注明博客出处
- 博主网址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,欢迎提出,邮箱:[email protected]
- 专业.NET之家技术QQ群:490539956
- 专业化Java之家QQ群:924412846
- 有问必答QQ群:2098469527
- 一对一技术辅导QQ:2098469527