豆のライフサイクル
豆ライフサイクル:
の破壊の豆の作成--- ----初期化プロセス
コンテナ管理のBeanのライフサイクル;
私たちは、初期化や破壊方法をカスタマイズすることができ、時間の現在のライフサイクルに豆の容器の中に私たちの習慣を起動します初期化および破壊方法----- 4通りの合計
建設(オブジェクトの作成)
単一インスタンス:開始コンテナ内のオブジェクトを作成するための
マルチ・インスタンス:たびの取得オブジェクトを作成します
初期化:
オブジェクトが作成され、良い割り当て、初期化メソッドが呼び出されます。。。
破壊:
シングルインスタンス:コンテナはときに閉じ
、マルチインスタンス:コンテナは、Beanを管理しませんが、コンテナが破壊メソッドを呼び出しません。
方法を指定します。
図1に示すように、初期化および破壊方法を指定します。
INIT-方法は破壊法と@Beanによりを指定します。
MainConfigOfLifeCycle:
パッケージcom.atguigu.config。 輸入org.springframework.context.ApplicationListener。 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.ComponentScan; 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.context.annotation.Scope。 輸入com.atguigu.bean.Car。 @Configuration パブリック クラスMainConfigOfLifeCycle { @Bean(にinitMethod = "INIT"、destroyMethodを= "detory" ) 公衆カー車(){ 返す 新しい)(カーを。 } }
車:
パッケージcom.atguigu.bean。 輸入org.springframework.stereotype.Component。 @成分 パブリック クラスの車{ パブリックカー(){ System.out.println( "カーコンストラクタ..." ); } 公共 ボイドのinit(){ System.out.println( "カー...のinit ..." ); } 公共 ボイドdetory(){ System.out.println( "カー... detory ..." ); } }
、豆はInitializingBean(定義された初期化ロジック)、DisposableBeanを達成できるようにすることで、2(定義されたロジックを破壊します)。
ネコ:
パッケージcom.atguigu.bean。 輸入org.springframework.beans.factory.DisposableBean。 輸入org.springframework.beans.factory.InitializingBean。 輸入org.springframework.stereotype.Component。 @成分 パブリック クラスキャットは実装InitializingBean、DisposableBeanを{ パブリックキャット(){ System.out.println( "猫のコンストラクタ..." ); } @オーバーライド 公共 のボイド破壊()はスロー例外{ // TODO自動生成されたメソッドスタブ のSystem.out.printlnを(「猫...破壊します...」); } @オーバーライド 公共 のボイド afterPropertiesSetは()スロー例外{ // TODO自動生成されたメソッドスタブを するSystem.out.println( "猫... afterPropertiesSet ..." ); } }
MainConfigOfLifeCycle
@ComponentScan( "com.atguigu.bean" ) @Configuration パブリック クラスMainConfigOfLifeCycle { }
図3は、JSR250を使用することができます。
@PostConstruct:Beanの作成が完了し、プロパティの割り当てが完了すると、初期化メソッドを実行するために
@PreDestroyを:聞かせて私たちは豆の容器の破壊前にクリーンアップするために働きます
犬:
パッケージcom.atguigu.bean。 輸入javax.annotation.PostConstruct。 輸入javax.annotation.PreDestroy。 輸入org.springframework.beans.BeansException。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.ApplicationContextAware。 輸入org.springframework.stereotype.Component。 @成分 パブリック クラス犬{ パブリック犬(){ System.out.println( "犬のコンストラクタ..." ); } // オブジェクトが作成され、割り当てられた後に呼び出さ @PostConstruct 公共 ボイドのinit(){ System.out.println( "犬.... @ PostConstruct ..." ); } // コンテナ前のオブジェクトの除去に @PreDestroy 公共 ボイドdetoryを(){ System.out.println( "犬.... @ PreDestroy ..." ); } }
MainConfigOfLifeCycle:
@ComponentScan( "com.atguigu.bean" ) @Configuration パブリック クラスMainConfigOfLifeCycle { }
4、BeanPostProcessorインターフェース[]:ビーンポストプロセッサ。
;いくつかの豆の初期化の前と後の処理作業
を開始する前に、作業:postProcessBeforeInitialization
postProcessAfterInitializationを:初期化後の作業
MyBeanPostProcessor:
パッケージcom.atguigu.bean。 輸入org.springframework.beans.BeansException。 輸入org.springframework.beans.factory.config.BeanPostProcessor。 輸入org.springframework.stereotype.Component。 / ** *ポストプロセッサ:前と後の初期化処理 *ポストプロセッサを容器に加え、 * @author LFY * / @成分 パブリック クラス MyBeanPostProcessorは実装BeanPostProcessorを{ @オーバーライド パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーン、文字列のbeanName)がスローBeansException { // TODO自動生成方法スタブ のSystem.out.println( "postProcessBeforeInitialization ..." +のbeanName + "=>" + 豆)を、 リターン豆。 } @オーバーライド パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)がスローBeansException { // TODO自動生成方法スタブ のSystem.out.println( "postProcessAfterInitialization ..." +のbeanName + "=>" + 豆)を、 リターン豆。 } }
初期化ビーン後(コンストラクタを呼び出す)----->)(postProcessBeforeInitializationを呼び出す-----> init()メソッド-----> postProcessAfterInitialization()
BeanPostProcessor原則
実行順序
BeanPostProcessor.postProcessBeforeInitialization -----
| -----初期化:オブジェクトが作成され、そして良い割り当て、初期化メソッドが呼び出されます。。。
----- BeanPostProcessor.postProcessAfterInitialization
実行フロー(BeanPostProcessor原理)
1、populateBean(のbeanName、MBD、instanceWrapper); -----属性は、Beanに割り当て
2、initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean、のbeanName)。
invokeInitMethods(のbeanName、wrappedBean、MBD); -----执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean、のbeanName)。
}
注:BeanPostProcessorを横断得られた全ての容器を、1 beforeInitializationずつ実行し、
Aが、ヌル戻され、forループのうち、後者はBeanPostProcessor.postProcessorsBeforeInitializationを実行しません
BeanPostProcessorのバネ下の使用
図1は、ApplicationContextAware後----- ApplicationContextAwareインタフェースはApplicationContextのsetApplicationContext()注射を介して実装することができます。
パッケージcom.atguigu.bean。 輸入org.springframework.beans.BeansException。 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.ApplicationContextAware。 輸入org.springframework.stereotype.Component。 @成分 パブリック クラス犬は実装ApplicationContextAwareを{ 民間のApplicationContextのApplicationContext。 @オーバーライド 公共 ボイド setApplicationContext(ApplicationContextのApplicationContextの)はスローBeansException { この .applicationContext = のApplicationContextと、 } }
プロパティの割り当て
@value割り当て
1、MainConfigOfPropertyValues
パッケージcom.atguigu.config。 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.context.annotation.PropertySource。 輸入com.atguigu.bean.Person。 // 使用@PropertySourceランニング環境変数を保存するために、K / Vを読み込むための外部設定ファイル; $ {}を使用して外部のプロファイルをロードが完了した後は、値プロファイル取り @PropertySourceを(値= {「クラスパス: /人.properties " }) @Configuration パブリック クラスMainConfigOfPropertyValues { @豆 公共の人人(){ 返す 新しい)(人を。 } }
2、人
パッケージcom.atguigu.bean。 輸入org.springframework.beans.factory.annotation.Value。 パブリック クラス人{ // 使用@value割り当て; // 1、基本値 // 2は、をSpeIで書き込むことができる。#{} // 。3、$ {}を記述することができ、プロパティの値は[]で撮影プロファイル(実行環境変数に内部値) @value(「ジョー・スミス」) プライベート文字列名; @value( "#{20-2}" )、 プライベート整数年齢。 @value( "$ {person.nickName}" ) プライベート文字列のニックネーム。 パブリック文字列getNickName(){ 戻りニックネーム。 } 公共 ボイドsetNickName(文字列のニックネーム){ この .nickName = ニックネーム。 } パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共の整数getAge(){ 戻り値の年齢。 } 公共 ボイドsetAge(整数歳){ この .age = 年齢; } 公共パーソン(文字列名、整数歳){ スーパー(); この .nameの= 名前; この .age = 年齢; } 公共の人(){ スーパー(); } @オーバーライド パブリック文字列のtoString(){ 戻り "人物[NAME =" +名+ "年齢=" +年齢+ "ニックネーム=" +ニックネーム+ "]" 。 } }
3、person.properties
person.nickName =ジョン・ドウ
注:クラスパスにプロファイルの場合、プロパティは次のようにして取得することができます。環境変数から値を直接取ることができ、設定ファイルの値は、環境の環境変数にロードされます。