春には再び学習(4)

年以上の後、彼は後の春、SpringBoot、SpringCloudを習得しました

もう一度、私は戻って、Springフレームワークを再学びます

 

Beanのライフサイクルの研究:

伝統的なXMLの構成では、カスタムの初期化や破壊方法になります

INIT-法= ""破壊法= ""

 

注釈モードを使用するのは簡単:

@Configuration
 パブリック クラスLifeCircleConfig { 
    @Bean(にinitMethod = " INIT "、destroyMethodをは= " 破壊" 公共{)車の車を(
         返す 新しい)(カーを。
    } 
}
パブリック クラスの車{
     パブリックカー(){ 
        System.out.printlnは( "車を構築!" ); 
    } 
    公共 ボイドのinit(){ 
        System.out.printlnは( "カーINIT!" ); 
    } 
    公共 ボイドが破壊(){ 
        System.out.printlnは( "車が破壊します!" ); 
    } 
}
パブリック クラスLifeCircleTest { 

    プライベート 静的 AnnotationConfigApplicationContextのApplicationContext = 新しい AnnotationConfigApplicationContext(LifeCircleConfig。クラス)。

    @Test 
    公共 ボイド試験(){ 
        applicationContext.close()。
    } 
}

注:メソッドを閉じる必要があり、それは車の破壊方法を印刷しません。

 

次のように印刷は次のとおりです。

車を構築!
車のinit
車が破壊します

 

ここでは、デフォルトでは豆の単一のインスタンスであります

それはマルチインスタンスである場合、上記のテストコードが追従印刷されない、複数インスタンスの場合ので、ビーン取得の場合には、オブジェクトを作成します

それが唯一の初期化と建設のメソッドを呼び出しますと例多くの場合、それは破壊のメソッドを呼び出すことはありません。

上記のテスト初期化コード補完IOCコンテナだけなので、何を印刷

 

春はインターフェイスモードを実装します。この時間は@Beanに設定する必要はありません。

パブリック クラスの車は実装InitializingBean、DisposableBean { 

    パブリックカー(){ 
        System.out.printlnはを( "!カーを構築します" )。
    } 

    パブリック 無効 afterPropertiesSet()スロー例外{ 
        System.out.printlnは( "車の初期化を!" ); 
    } 

    公共 ボイドが破壊(){ 
        System.out.printlnは( "車が破壊します!" ); 
    } 

}

 

ネイティブJavaアノテーションを使用します。

パブリック クラスの車{ 

    パブリックカー(){ 
        System.out.printlnは( "車を構築!" ); 
    } 

    @PostConstruct 
    公共 ボイドのinit(){ 
        System.out.printlnは( "車の初期化を!" ); 
    } 

    @PreDestroy 
    公共 ボイド(破壊){ 
        System.out.printlnはは( "車が破壊します!" ); 
    } 

}

 

春の豆は、ポストプロセッサで使用されます:

@Component
 パブリック クラス MyBeanPostProcessorが実装BeanPostProcessor {
     / ** 
     *初始化前调用
     * / 
    パブリックオブジェクトpostProcessBeforeInitialization(オブジェクト・ビーン、文字列のbeanName)がスローBeansException { 
        するSystem.out.println( "postProcessBeforeInitialization" +豆+ "" + のbeanName)を、
        リターン豆。
    } 

    / ** 
     *初始化后调用
     * / 
    パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)スローBeansException { 
        するSystem.out.printlnを("postProcessAfterInitialization" +豆+ "" + のbeanName)。
        リターン豆。
    } 
}
@Configuration 
@ComponentScan( "org.dreamtech.bean" のパブリック クラスLifeCircleConfig { 
    @Bean 
    パブリックカー車(){
         返す 新しい)(カーを。
    } 
}

 

次のように印刷検査部の後:

車を構築!
postProcessBeforeInitialization org.dreamtech.bean.Car@2d9d4f9dカー
postProcessAfterInitialization org.dreamtech.bean.Car@2d9d4f9d車

 

BeanPostProcessor原理:

ソースコードのこのセクションを表示します。

initializeBean(のbeanName、exposedObject、MBD)方法:

        wrappedBean =オブジェクト豆を、
        もし(MBD == NULL ||!mbd.isSynthetic()){ 
            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean、のbeanName)。
        } 

        試みる{ 
            invokeInitMethods(のbeanName、wrappedBean、MBD)を、
        } 
        キャッチ(ThrowableのEX){
             スロー 新しいBeanCreationException(
                    (MBD =!ヌル mbd.getResourceDescription():?ヌル)、
                    のbeanNameは、 "initメソッドの呼び出しに失敗しました" 、EX); 
        }

        もし(MBD == NULL ||!mbd.isSynthetic()){ 
            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean、のbeanName)。
        }

invokeInitMethods初期化メソッドの前に

すべての後処理方法の前に呼ばれるコールapplyBeanPostProcessorsBeforeInitialization、

初期化メソッドの後invokeInitMethods

ポストプロセッサのすべてのメソッドの後に呼び出されapplyBeanPostProcessorsAfterInitializationを、コール

 

ソースコードを表示するapplyBeanPostProcessorsBeforeInitializationの方法を入力します。

すべてのプロセッサを介して、リターンヌル時に、それは蚊帳の外になります

    @Override
     パブリックオブジェクトapplyBeanPostProcessorsBeforeInitialization(existingBean、文字列のbeanName物体)
             スローBeansException { 

        オブジェクト結果を = existingBean。
        (BeanPostProcessor beanProcessor:getBeanPostProcessors()){ 
            結果 = beanProcessor.postProcessBeforeInitialization(結果のbeanName)。
            もし(結果== NULL ){
                 リターン結果。
            } 
        } 
        戻り値の結果; 
    }

 

initializeBean方法の前に、メソッド呼び出しがpopulateBeanです

役割:それらを割り当て、

        //は、Beanインスタンスを初期化します。
        exposedObject =オブジェクト豆を、
        試す{ 
            populateBean(のbeanName、MBD、instanceWrapper)。
            もし(!exposedObject = NULL ){ 
                exposedObject = initializeBean(のbeanName、exposedObject、MBD)。
            } 
        }

 

だから、:BeanPostProcessor豆は、初期化プロセスの実行前と後に、割り当ての後で

 

使用中の春の一番下BeanPostProcessor:

インタフェースIOCコンテナを取得します。

パブリック インターフェース ApplicationContextAwareは延び{認識
     ボイド setApplicationContext(ApplicationContextのvar1が)スローBeansException。
}

そして、それはBeanPostProcessorに基づいており、コードが長すぎる傍受されていません

クラス ApplicationContextAwareProcessorは実装 BeanPostProcessorを

 

またはパラメータのチェック:BeanPostProcessorを使用します

パブリック クラス BeanValidationPostProcessorは実装 BeanPostProcessor、InitializingBeanを

コードの一部を次のように

    パブリックオブジェクトpostProcessBeforeInitialization(オブジェクトBean、文字列のbeanName)がスローBeansException {
         場合(!この.afterInitialization){
             この.doValidate(豆); 
        } 

        戻りビーン。
    } 

    パブリックオブジェクトpostProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)がスローBeansException {
         場合この.afterInitialization){
             この.doValidate(豆)を、
        } 

        戻りビーン。
    }

 

おすすめ

転載: www.cnblogs.com/xuyiqing/p/11307820.html