SpringのBeanPostProcessorポストプロセッサとBeanのライフサイクル

序文

    この記事では、ポストプロセッサ11のライフサイクルに春の豆に関連する実際の拡大が、また、フォローアップ探査ゆっくり要約の各ポストプロセッサの使用など、整理、および機能についての簡単な話。

テキスト

    ステップによって次のステップでは、これらのポストプロセッサのための彼らの調査をフォローアップします。まず、クラスAbstractApplicationContextリフレッシュ方法を入力し、この方法にfinishBeanFactoryInitializationテンプレートメソッドを追跡し続け、その後、beanFactory.preInstantiateSingletons()メソッドを介してクリックし、DefaultListableBeanFactoryカテゴリを入力し、クリックスルーgetBean法、豆のコアを得ることですdoGetBean方法を、クリックし続けますこの方法が、我々は徐々にしか知らない獣に近づいて、AbstractAutowireCapableBeanFactory#たcreateBean方法に入るのポイントをしたcreateBean方法ラムダ式を懸念しています。

1位

    resolveBeforeInstantiationたcreateBean法の方法では、コールは最初のポストプロセッサで満たされ、すなわち2つのトーン:InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiationと

BeanPostProcessor.postProcessAfterInitialization。下のスクリーンショットに示すように:

 

 

ここで豆の前にメソッドの戻りがnullでない場合、メソッドの戻りたcreateBean方法は、(すなわち、後続2-8プロセッサが行っていない)が、直接返却を下に行くことはありません。

春の追加インスタンスの使用について話しています。カットBeanクラスが存在する場合、次いでAbstractAutoProxyCreator#postProcessBeforeInstantiationに実装ロジックを呼び出し、このメソッドは、後続カットが自動的advisedBeansにインターセプトオブジェクトを無視するように、advisedBeansアスペクトクラスを追加します。

二位

    SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors:たcreateBeanの方法がcreateBeanInstance法と呼ばdetermineConstructorsFromBeanPostProcessors方法でdoCreateBeanを入力して、ポストプロセッサで2番目の呼び出しがあります。ポストプロセッサは、コンストラクタを推定するように構成され、以下に示すスクリーンショット、デフォルト実装クラスがAutowiredAnnotationBeanPostProcessor呼び出されます。

 

 

 第三位

    MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition:バックdoCreateBean方法は、ポストプロセッサは、第三位と呼ばれて見つけ、applyMergedBeanDefinitionPostProcessors方法を見下し続けています。スクリーンショットは次のとおりです。

 

 

 4位

    SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference:4位のコールで見つかったgetEarlyBeanReference方法、でdoCreateBeanを見下ろしてください。循環依存関係を解決するために本明細書中で使用され、以下のように、ショットは以下のとおりです。

 

 

 5位

    继续往下,进入populateBean方法,在此方法中有两处调用,第五处:InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation。返回布尔类型,用于判断是不是需要属性填充,如果返回false则直接从populateBean中返回,不再执行第6/7/8处。

 

 

 第六处

    第六处调用了两个方法:InstantiationAwareBeanPostProcessor.postProcessProperties和InstantiationAwareBeanPostProcessor.postProcessPropertyValues。此处用于做属性填充,截图如下:

 

 

 第七处

    回到doCreateBean中继续往下,进入initializeBean方法,此方法中也有两处调用,在applyBeanPostProcessorsBeforeInitialization中调用了第七处:BeanPostProcessor.postProcessBeforeInitialization。

调用的是通常意义上BeanPostProcessor的before方法

 

 第八处

    在applyBeanPostProcessorsAfterInitialization中调用了第八处:BeanPostProcessor.postProcessAfterInitialization。调用的是通常意义上BeanPostProcessor的after方法

 

Spring的切面就是基于此方法进行的,调用的实现方法是AbstractAutoProxyCreator#postProcessAfterInitialization。它会先将切面类放入advisedBeans中,标记为true,表示需要用切面拦截。然后调用AbstractAutoProxyCreator#createProxy方法生成代理。

第九处

    第九处是在执行AbstractApplicationContext#close方法销毁bean时触发的,最终调用到的是DisposableBeanAdapter#destroy,在此方法中调用了:DestructionAwareBeanPostProcessor.postProcessBeforeDestruction。用于在销毁bean之前做操作。为什么DestructionAwareBeanPostProcessor中没有after方法?因为执行after的时候所有bean都没了,Spring认为你也没必要做什么扩展了。

 

 

小结

    以上就是Spring的bean声明周期内经手的9处后置处理器调用,共涉及到5个接口,本文只是简要说明了其作用,其真实的使用场景很多,需要后续慢慢摸索。

 

おすすめ

転載: www.cnblogs.com/zzq6032010/p/11789076.html