[春のソースコード分析] Beanのライフサイクル

フローチャート:

 

13の段階があります

1.Beanメタ情報構成段階

Bean情報は4つの方法で定義されます

  1. APIの方法
  2. Xmlファイルメソッド
  3. プロパティファイルメソッド
  4. アノテーション方式

APIメソッド:

BeanDefinitionインターフェースを実装します。5つの特定の実装クラスがあります。

  • RootBeanDefinition:ルートBean定義情報。親BeanのないBeanを示します
  • ChildBeanDefinition:子Bean定義情報。parentNameプロパティを介して親Beanを指定する必要があります
  • GenericBeanDefinition:汎用Bean定義情報。親BeanのないBean、または親Beanのある子Beanを表すことができます。親属性もあります。
  • ConfigurationClassBeanDefinition:構成クラスの@beanメソッドによって定義されたBean情報。
  • AnnotatedGenercBeanDefinition:アノテーションによって定義されたBean情報

直接インスタンス化するだけです。

Xmlの方法:

<bean id="bean名称">
    <constructor-arg index="0" value="bean的值" ref="引用的bean名称" />
</bean>

最後に、XmlBeanDefinitionReaderクラスを介してAPIの構成メソッドに解析されます

プロパティファイルメソッド:

employee.(class)=MyClass       // 等同于:<bean class="MyClass" />
employee.(abstract)=true       // 等同于:<bean abstract="true" />
employee.group=Insurance       // 为属性设置值,等同于:<property name="group" value="Insurance" />
employee.usesDialUp=false      // 为employee这个bean中的usesDialUp属性设置值,等同于:等同于:<property name="usesDialUp" value="false" />

最後に、PropertiesBeanDefinitionReaderクラスを介してAPIの構成メソッドに解析されます

注釈方法:

@beanまたは@Compontentは、最終的にAPIの構成メソッドに解析されます

2.Beanメタ情報分析段階

メタ情報分析には、主に3つの方法があります。

  1. xmlファイル定義Bean分析(XmlBeanDefinitionReader)
  2. プロパティファイル定義Beanの分析(PropertiesBeanDefinitionReader)
  3. アノテーションメソッド定義Bean分析(PropertiesBeanDefinitionReader)

 

3、Beanをコンテナに登録します

Bean登録インターフェース:BeanDefinitionRegistry(継承AliasRegistry

エイリアス登録インターフェース:AliasRegistry

 

最初の3つのステップは、iocコンテナーが作成されるときに発生し、次の4〜10のステップはgetBeanが作成されるときに発生します。

4、BeanDefinitionマージフェーズ

Bean定義には、完全な情報を含むRootBeanDefinitionに再帰的にマージされた、マルチレベルの親子関係がある場合があります。

合併のソースコードは次のとおりです。

このRootBeanDefinitionは後続のステージで使用され、次のステップは、依存Beanをロードする必要があるかどうかを確認することです。ロードする必要がない場合は、スキップします(画像は傍受されません)。

5、Beanクラスのロードフェーズ

Beanのクラス名をClass型のオブジェクトに変換します。

ソースコードは次のとおりです。

特定のresolveBeanClassメソッドをさらに深く掘り下げると、Class.forNameを介して取得された最終的なクラスオブジェクトがわかります。

これでクラスオブジェクトができたので、リフレクションを通じてインスタンス化を開始できます。

6、Beanインスタンス化ステージ

(1)インスタンス化前

BeanPostProcesstorインターフェースを実装するクラスのpostProcessBeforeInitializationメソッドが実行されます。

ソースコードは次のとおりです。

Beanが返されると、SpringはBeanを直接使用し、次のBean作成操作をスキップすることがわかります(これはSpringの拡張ポイントです)

(2)インスタンス化

このプロセスでは、リフレクションを使用してBeanコンストラクターを呼び出してBeanのインスタンスを作成し、最後にそれをBeanWrapperにラップします。(使用されるデコレータモード)

ソースコードは次のとおりです。

ここストラテジーモードが使用され、SimpleInstantiationStrategyクラスで処理されます。

最後に、BeanUtilsクラスのInstantiateClassメソッドで呼び出されるクラスのnewInstanceメソッド(コア)

7、マージされたBeanDefinition処理

後処理クラスは、後で使用するのに便利なキャッシュ処理を実行します

これは主に、MergedBeanDefinitionPostProcessorインターフェースを実装するクラスでコールバック処理を実行します。実装クラスには主に次のものが含まれます。

  • AutowiredAnnotationBeanPostProcessorは、後で使用するために@Autowiredおよび@Valueアノテーションが付けられたフィールドまたはメソッドをキャッシュします
  • CommonAnnotationBeanPostProcessorは、@ Resourceアノテーションが付けられたフィールドまたはメソッド、@ PostConstructアノテーションが付けられたメソッド、および@PerDestroyアノテーションが付けられたメソッドをキャッシュします。

8つの属性割り当て段階

(1)インスタンス化後の段階

Springは、InstantiationAwareBeanPostProcessorインターフェースを実装するクラスのpostProcessAfterInstantiationメソッドを呼び出します。

falseが返された場合、属性割り当ての次の2つのステップはスキップされます。したがって、属性の割り当てを防ぐために使用できます

(2)Bean属性割り当ての前の段階

主に@Autowireおよびその他のアノテーションを介して、後で割り当てるために属性の値生成します

postProcessPropertiesとpostProcessPropertyValuesの両方が空を返す場合、それはBeanがプロパティを設定する必要がなく、次のステージに入るために直接戻ることを意味していることがわかります。

PropertyValuesは、Beanインスタンスオブジェクト内のすべてのプロパティ値の設定を保存するため、このpostProcessPropertiesでPropertyValues値を変更できます。

InstantiationAwareBeanPostProcessorの実装クラスは次のとおりです。

最も重要なことは、これら2つの実装クラス値のインジェクション操作です。

  • インジェクションのAutowiredAnnotationBeanPostProcessorフィールドまたはメソッドの値@Autowiredは@Valueとマークされています
  • CommonAnnotationBeanPostProcessorは、@ Resourceアノテーションが付けられたフィールドまたはメソッドに値を挿入します

(3)Bean属性の割り当て段階

処理PropertyValuesで属性値情報を循環させ、リフレクションを介してsetメソッドを呼び出して属性値をBeanインスタンスに設定します。

9回のベンドと18回のベンドの後、最後の呼び出しは、BeanWrapperImplのsetValueメソッドでのリフレクションを介してフィールドに値を割り当てることです。

9、Bean初期化フェーズ

(1)BeanAwareインターフェースのコールバック

(2)Bean初期化前の操作

Springは、BeanPostProcessorインターフェースを実装する実装クラスのpostProcessBeforeInitializationメソッドを呼び出します。

実装クラスには多くが含まれています(完全ではありません)

重要なのは

  • ApplicationContextAwareProcessorは6Awareを注入します。含む:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware。ApplicationContext環境のみがこれらを使用できるため
  • InitDestroyAnnotationBeanPostProcessorは、@ PostConstrustアノテーションが付けられたすべてのメソッドを呼び出すために使用されます

(3)Bean初期化操作

1.InitializingBeanインターフェースを実装するBeanのafterPropertiesSetメソッドを呼び出します

2.Beanの定義時に指定されたinit-method初期化メソッドを呼び出します

初期化方法を指定するには、次の3つの方法があります。

  1. xmlメソッドの仕様   <beaninit-method = "beanのメソッド名" />
  2. @beanメソッドは@Bean(initMethod = "initialization method")を指定します 
  3. apiメソッドはbeanDefinition.setInitMethodName(methodName);を指定します 

(4)Bean初期化後の操作

Springは、BeanPostProcessorインターフェースを実装する実装クラスのpostProcessAfterInitializationメソッドを呼び出します。

10、Beanの初期化が完了した後の段階

FactoryBeansを考慮して、すべての非レイジーシングルトンがインスタンス化されることを保証するため

したがって、すべてのBeanの初期化が完了すると、SpringはSmartInitializingSingletonインターフェースを実装するafterSingletonsInstantiatedメソッドを初期化します。

BeanFactory自体も含まれます。

ApplicationContextを持つコンテナーは、最終的にpreInstantiateSingletonsを内部的に呼び出して、すべてのシングルトンBeanの初期化をトリガーします。

11.豆の使用段階

言うまでもなく

12.Beanの破壊前の段階

Beanを破棄する方法は3つあります。

  1. AbstractAutowireCapableBeanクラスのdestroyBeanメソッド
  2. ConfigurableBeanFactoryクラスのdestroymentSingletonsメソッド
  3. ApplicationContextのcloseメソッド

Bean破棄フェーズは、次の順序で実行されます。

  1. beanPostProcessorsのリストをポーリングします。タイプがDestructionAwareBeanPostProcessorの場合、その内部postProcessBeforeDestructionメソッドが呼び出されます。

  2. Beanがorg.springframework.beans.factory.DisposableBeanインターフェースを実装している場合、このインターフェースのdestroyメソッドが呼び出されます。

  3. Beanのカスタム破棄メソッドを呼び出す

 

Springは、DestructionAwareBeanPostProcessorインターフェースを実装するクラスのpostProcessBeforeDestructionメソッドを呼び出します。

実装クラスは次のとおりです。

重要なのは:

  • CommonAnnotationBeanPostProcessorBean内の@PreDestroyアノテーションが付けられたすべてのメソッドを呼び出します

13、豆の破壊段階

破壊方法をカスタマイズする方法は3つあります。

  1. xmlで破棄メソッドを指定します<beandestroy-method = "beanのメソッド名" />
  2. @Beanは、破棄メソッド @Bean(destroyMethod = "initialization method")を指定します 
  3. apiメソッドは、破棄メソッドbeanDefinition.setDestroyMethodName(methodName);を指定します 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/sumengnan/article/details/113702527