春のIoCコンテナ豆の初期化プロセス、本来の目的の春のIoCコンテナは、コンテナ内のそのライフサイクルの存在のために豆、豆を管理することで、彼の初期化と破壊は、プロセスを必要とし、プロセスは、いくつかの自己定義が必要です私たちは、ライフサイクルの春豆知識を使用する必要があり、特定のニーズを満たすために彼らの行動の一部を変更するコードを挿入することができます。
春のIoCコンテナの初期化プロセスのライフサイクルを理解し、豆を破壊するために。次の図は、豆のプロセススプリングIoCコンテナの初期化および破壊を示します
手順を説明します。
1豆は、インターフェイスを実装した場合。BeanNameAware setBeanName方法のを、このメソッドを呼び出すと、春のIoCコンテナ管理ビーンとなります。
2 Beanのインタフェースを実装した場合。BeanFactoryBean setBeanFactory方法のを、それがこのメソッドを呼び出します。
3。ビーンは、インタフェース実装する場合ApplicationContextAware setApplicationContextメソッドのを、そして春のIoCコンテナにもApplicationContextのインタフェースの実装クラスである必要があり、それはそれ以外の場合は呼び出されません、このメソッドを呼び出します。
4 Beanのインタフェースを実装している場合。BeanPostProcessor postProcessBeforeInitialization方法を、それがこのメソッドを呼び出します。
5 Beanのインタフェースを実装した場合。BeanFactoryPostProcessor afterPropertiesSet方法を、彼は、このメソッドを呼び出します。
6豆カスタム初期化メソッド場合は、カスタムの初期化メソッドを呼び出します。
7ビーンは、インタフェースに実装している場合。BeanPostProcessor postProcessAfterInitialzation方法を、これらの呼び出しを完了し、この時点ビーンの初期化は、春のIoCコンテナの中にもありますが、ユーザーは豆のサービスを導き出すことができ、完了です。
サーバーがダウンしているかオフになって春のIOCの出会いである場合には、以下のように、彼は、Beanの破壊に呼び出されます
8 Beanのインタフェースを実装した場合。DisposableBean方法を破壊し、それを呼び出します。
9あなたが破壊の独自のメソッドを定義している場合、それは、カスタムメソッドを実行します。
彼は理論の多くは、その後、我々はそれを証明次の練習をすると発表しました
図1は、まず、春のIoCコンテナは、それを管理するために聞かせて、私たちが達成するために必要なこの時間BeanPostProcessImplクラスを定義BeanPostProcessorの、インターフェースを4と7を証明します。
パッケージ pro.jamal.blog.domain。輸入 org.springframework.beans.BeansException。 輸入 org.springframework.beans.factory.config.BeanPostProcessor。/ ** * @author:lyj * @Date:2019年6月2日 * / パブリッククラス BeanPostProcessImpl 実装 BeanPostProcessor { / ** *在初始化之前的方法 * / @Override パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーンは、ストリングS)がスロー BeansExceptionを{ のSystem.out.println( " [ "+ bean.getClass()getSimpleName()+" ]:初始化开始... ")。 リターン 豆; } / ** 初期化後の処理* * / @Override パブリックオブジェクトpostProcessAfterInitialization(Beanオブジェクト、文字列S)がスロー BeansException { するSystem.out.println( " [ " + bean.getClass()getSimpleName()+ "を]:端の例... \ N-BYE「); 戻り豆を、 } }
2、インターフェース1,2,3,5、その後、カスタム初期化メソッドを実装するクラスの定義の中で、第6条の理論を証明するために、簡単な印刷
パッケージ pro.jamal.blog.domain。輸入 org.springframework.beans.BeansException。 輸入 org.springframework.beans.factory *。; 輸入 org.springframework.context.ApplicationContext; 輸入 org.springframework.context.ApplicationContextAware。/ ** * @author:lyj * @Date:2019年6月2日 * / パブリッククラスの人が実装 BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean、DisposableBean { プライベート文字列名を、 プライベート 整数歳。 @Override 公共のボイド setBeanFactory(たBeanFactoryたBeanFactory)はスロー BeansException { するSystem.out.println( " [ "+ この .getClass()getSimpleName()+" ] "+" 了BeanFactoryAware接口的setBeanFactory方法调用 ")。 } @Override 公共ボイド setBeanName(文字列S){ するSystem.out.println( " [ "+ この .getClass()getSimpleName()+" ] "+" 了BeanNameAware接口的setBeanName方法调用 ")。 } @Override 公共ボイド(破壊)スロー {例外 System.out.println( " "+ この .getClass()getSimpleName()+" ] "+" 调用了DisposableBean接口的破壊方法 ")。 } @Override 公共ボイド afterPropertiesSet()スロー {例外 ( "するSystem.out.println [ "+ この .getClass()getSimpleName()+" ] "+" 了InitializingBean接口的afterPropertiesSet方法调用 ")。 } @Override 公共ボイド setApplicationContext(ApplicationContextのApplicationContextの)はスロー BeansException { のSystem.outは。 " + この。.GetClass()getSimpleName()+" ] "+" setApplicationContext ApplicationContextAwareインタフェースメソッドを呼び出す "); } 公共ボイド diyInit(){ System.out.printlnは(" [「+ この .GetClass(。)getSimpleName ()+ " ] " + " カスタム初期化開始 "); } パブリック文字列のgetName(){ 戻り名; } 公共ボイドのsetName(文字列名){ この .nameの=名; } パブリック整数getAge(){ 戻り年齢; } パブリック ボイド setAge(整数年齢){ この .age =年齢。 } }
3、xml設定
<?xml version =」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 "> <ビーンクラス = " pro.jamal.blog.domain.BeanPostProcessImpl "/> <ビーンクラス =" pro.jamal.blog.domain.Person " INIT-方法= " diyInit "> <プロパティ名=」名前"値=" yongjar "/> <プロパティ名=" 年齢 "値=" 14「/> </豆> </豆>
4.テスト
パブリック クラス BeanCycleTest { 公共 静的 ボイドメイン(文字列[]引数){ ClassPathXmlApplicationContextコンテキスト= 新しい ClassPathXmlApplicationContext( " bean.xml ")。 人豆= context.getBean(人。クラス)。 System.out.println(bean.getName()+ " " + bean.getAge()); context.close(); } }
印刷結果