BeanPostProcessorインタフェースの役割:
我々は終了したい場合はBeanは、インスタンス化の前にSpringコンテナおよびその他の初期化メソッドで設定し、独自のロジックの一部を追加したいです。私たちは、1つ以上のクラスBeanPostProcessorインターフェイスを定義し、その後、春のIoCコンテナを登録する必要があります。
パッケージcom.test.spring。 輸入org.springframework.beans.BeansException。 輸入org.springframework.beans.factory.config.BeanPostProcessor。 / ** *豆后置处理器 * @author ZSS * * / パブリック クラスポストプロセッサは、実装BeanPostProcessor { @Override パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーン、 文字列のbeanName)がスローBeansException { 場合( "narCodeService" .equals(のbeanName)){ /を/ 过滤掉ビーン实例ID为narCodeServiceの 戻りビーン。 } System.out.println( "后置处理器处理豆=【" +のbeanName + "】开始" )。 してみてください{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 戻りビーン。 } @Override パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、 文字列のbeanName)スローBeansException { 場合( "narCodeService" .equals(のbeanName)){ 戻りビーン; } のSystem.out.println("ポストプロセッサBeanが= [" +のbeanName + "]完了!" ); 試み{ のThread.sleep( 1000年); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } 戻り豆を、 } }
2種類のインタフェースメソッドがnullを返すことができません、ポストプロセッサは、Beanインスタンス春のIoCコンテナから削除するので、それは、その後の初期化メソッドまたはオブジェクトBENAないインスタンスを取得するgetBeanヌル・ポインタ例外()メソッドによって報告される場合はnullが返されます。注意してくださいオブジェクトが再びIoCコンテナを置いていません!
設定するには、ポストプロセッサ春のポストプロセッサSpring構成ファイル
<?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" > <! - 定义一个豆- > < ビーンID = "narCodeService" クラス= "com.test.service.impl.NarCodeServiceImpl" > </ ビーン> < ビーンID =」= "com.test.spring.BeanLifecycle" のinitメソッドは、"initの" = 破壊法= "近い" > < プロパティ名= "名前" 値= "张三" > </ プロパティ> < プロパティ名= "セックス" 値= "男" > </ プロパティ> </ 豆> <! - 春后置处理器- > < 豆ID = "ポストプロセッサ" クラス= "com.test.spring.PostProcessor" /> </ 豆>
BeanPostProcessorのAPI:
パブリック インターフェースBeanPostProcessor { // インスタンス化依存性注入が完了すると、初期化コールの表示の前にいくつかのカスタム初期化タスクの完了 オブジェクトpostProcessBeforeInitializationは(豆、のbeanName文字列オブジェクト)がスローBeansExceptionを; // 初期化するときにインスタンス化依存性注入が実行される オブジェクトpostProcessAfterInitialization(豆、のbeanName文字列オブジェクト)スローBeansExceptionを; }
APIから見ることができます
。1:メソッドpostProcessorBeforeInitailizationポストプロセッサは、Beanをインスタンス化、およびカスタム依存性注入初期化メソッドの後に(例えば:、Javaクラスの初期化メソッドを指定する豆のタグプロファイルのinit-method属性を追加しています
@ PostConstruct注釈指定イニシャライザ、Javaクラスは、呼び出しの前に)InitailztingBeanインタフェースを実装
postProcessorAfterInitailization方法ポストプロセッサビーンインスタンス化され、依存性注入とカスタマイズ初期化メソッド呼び出し2:
注:
1.BeanFactoryのApplicationContext二豆容器は、治療しますポストプロセッサは、わずかに異なっています。春のApplicationContextコンテナの設定ファイルは自動的にJavaクラスに対応するものは豆BeanPostProcessorの実装に検出します
インターフェイスを、自動的にポストプロセッサとして登録します。ポストプロセッサの展開は普通の豆とあまり差がないように作成Beanは、プロセスにそれらを呼び出します。
コードは2.BeanFactoryコンテナ登録ビーンポストプロセッサ、登録方法で定義されたConfigurableBeanFactory IoCコンテナインタフェースの継承階層を表示登録する必要があります
空 addBeanPostProcessor(BeanPostProcessor beanPostProcessor)。
複数BeanPostProcessor実装クラスを呼び出す方法を春:
私たちは、春のコンテナはターンの呼び出しで定義された順序ポストプロセッサのデフォルトに従ってますBeanPostProcessor Spring構成ファイル(ポストプロセッサ)インターフェイスクラスを複数追加することができます。
Spring構成ファイル:
<?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" > <! - 豆定义- > < ビーンID = "narCodeService" クラス= "com.test.service.impl.NarCodeServiceImpl" > </ ビーン> < ビーンID =」= "com.test.spring.PostProcessor" /> < ビーンID = "postProcessorB" クラス= "com.test.spring.PostProcessorB" /> </ 豆>
実装クラスBeanPostProcessor:
パッケージcom.test.spring。 輸入org.springframework.beans.BeansException。 輸入org.springframework.beans.factory.config.BeanPostProcessor。 / ** *豆后置处理器 * @author ZSS * * / パブリック クラスポストプロセッサは、実装BeanPostProcessor { @Override パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーン、 文字列のbeanName)がスローBeansException { するSystem.out.println(「后置处理器处理豆を【= "+のbeanName +"】开始」)。 してみてください{ (のThread.sleepを1000年); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 戻りビーン。 } @Override パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーンは、 文字列のbeanName)がスローBeansException { するSystem.out.println( "后置处理器处理豆=【" +のbeanName + "】は完毕!" )。 してみてください{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 戻りビーン。 } } ------------------------------------------------ -------------------------------------------------- -------------------------------------- パッケージcom.test.spring。 輸入org.springframework.beans.BeansException。 輸入org.springframework.beans.factory.config.BeanPostProcessor。 パブリック クラス PostProcessorBは実装BeanPostProcessor { @Override パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーン、 文字列のbeanName)スローBeansException { するSystem.out.println( "后置处理器开始调用了" )は してみてください{ (のThread.sleep 1000); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 戻りビーン。 } @Override パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、 文字列のbeanName)スローBeansException { するSystem.out.println( "后置处理器调用结束了" )は してみてください{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 戻りビーン。 } }
テストケース:
パッケージcom.test.spring。 輸入org.junit.Before; 輸入org.junit.Test; 輸入org.springframework.context.support.AbstractApplicationContext; 輸入org.springframework.context.support.ClassPathXmlApplicationContext; パブリック クラスT { AbstractApplicationContextのApplicationContext = NULL ; @Before 公共 ボイド(){前 のSystem.out.println( "" ""春のApplicationContext容器开始初始化了......" ); ApplicationContextの = 新しい ClassPathXmlApplicationContext(新文字列[] { "TEST1-service.xmlに" }); のSystem.out.println( "" "" ApplicationContextの容器のスプリングが初期化...... " ); } @Test 公共 ボイド 試験(){ ApplicationContextの。 registerShutdownHook(); } }
テスト結果:
「」「春のApplicationContextコンテナの初期化を開始...... 2017年3月19日10時50分29秒INFO:ClassPathXmlApplicationContext-リフレッシュorg.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9:起動日[日3月19日10: CST 2017 50:29];根のコンテクスト階層 2017年3月19日10時50分29秒INFO:Beanクラスパスリソース定義からXML-XmlBeanDefinitionReaderをロード[test1- service.xmlに】 後処理プロセスビーン = [] narCodeService開始 呼び出しポストプロセッサ開始 ポストプロセッサBeanを = [] narCodeServiceは!の終了 ポストプロセッサの通話が終了 春のApplicationContextコンテナの初期化が終了した」「」...... 2017年3月19日10時50分34秒INFO:ClassPathXmlApplicationContext-閉会org.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9:起動日[日3月19日午前10時50分29秒CST 2017]; ルートのコンテキスト階層
整数を返す方法、デフォルト値は0であり、最高の優先度、優先度の低い値を実装getOrderクラス順序インターフェースようBeanPostProcessorインターフェースによって呼び出しシーケンスポストプロセッサばね機構に指定することができます