ホームページ  >  記事  >  Java  >  Spring がオブジェクトを挿入する方法と Bean 作成プロセスの分析

Spring がオブジェクトを挿入する方法と Bean 作成プロセスの分析

angryTom
angryTom転載
2019-11-28 17:47:533137ブラウズ

Spring がオブジェクトを挿入する方法と Bean 作成プロセスの分析

#まずは大まかな実装を知る必要があります

● この注入プロセスは BeanPostProcessor で実装する必要があります

#Spring は beanFactory.getBean で Bean をインスタンス化します。つまり、遅延読み込みです。

#● 2 番目の記事によると、つまり、すべての BeanPostProcessor は getBean の場合にのみ呼び出されます。

● 2 番目の記事では、BeanFactory のリフレッシュ プロセスは BeanPostProcessor のみを登録し、実際には getBean メソッド

で実行されると述べました (推奨ビデオ:

java ビデオ チュートリアル ) MergedBeanDefinitionPostProcessor も BeanPostProcessor の一種です。BeanPostProcessor のデフォルトのライフサイクル関数を置き換えて、新しいライフサイクル関数を作成します。このように見てみましょう。短いソース コード

for (BeanPostProcessor bp : getBeanPostProcessors()) {
    if (bp instanceof MergedBeanDefinitionPostProcessor) {
        MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
        bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
    }
}

これにより、BeanFactoryProcess 以外の Bean 定義を変更できます

InstantiationAwareBeanPostProcessor も BeanPostProcessor です。また、ライフサイクル関数も再定義され、プロパティ値をプロパティ オブジェクトに挿入

@Autowired 定義をロードするプロセス

最初に Bean 作成プロセスではなく、MergedBeanDefinitionPostProcessor の実装サブクラスを見てみましょう。名前は推測です。

AutowiredAnnotationBeanPostProcessor これはその動作のはずなので、

AutowiredAnnotationBeanPostProcessor の postProcessMergedBeanDefinition メソッドのコードを直接確認できます。

メソッド呼び出しに続いて、これらのアノテーションが実際に見つかる場所が buildAutowiringMetadata であることがわかります。最後に、checkConfigMembers が Member を Bean 定義に登録します。それを見つける方法を知りたい読者は、ソース コードを自分でチェックできます。

ここでは、メンバーを Bean 定義に登録するだけであり、実際のインスタンス化は Bean を埋めるプロセス中に発生します。以下で Bean の作成プロセスについて説明します。Bean がいつ注入されるかを知ることができます。

Bean 作成プロセス

Spring では getBean の処理で Bean を作成しますが、Bean の作成はいくつかのステップに分かれています

1. Bean 定義の取得

2. new Bean()

3. ライフサイクル関数の実行 (前)

4. 依存関係の作成

5 . 記入Bean

6. ライフサイクル関数の実行 (後)

入り口は BeanFactory.getBean 、BeanFactory の実装クラスは DefaultListableBeanFactory です。これらは BeanFactory の更新プロセスで見つけることができます。

ソースコードによると、まだBeanが存在しない場合はBean作成処理が実行されます

このソースコードでBean定義を取得します

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

フォローしてください、Bean定義項目に従ってその依存関係を検索し、Beanを作成すると、Beanが再帰的に作成されることがわかります

String[] dependsOn = mbd.getDependsOn();
for (String dep : dependsOn) {
    getBean(dep);
}

その後、Beanが作成されます

if (mbd.isSingleton()) {
    createBean(beanName, mbd, args);
}
// 真正的执行在 doCreateBean 过程中
Object beanInstance = doCreateBean(beanName, mbdToUse, args);

The first step to create the Bean is new Bean

if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
}

2 番目のステップは Bean を作成することです ステップ 1: MergedBeanDefinitionPostProcessor を含むすべてのプロセッサを実行するため、このステップで注入オプションを登録します

applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

Bean を作成します3 番目のステップは、Bean を埋めることです。ここで @Autowired インジェクションが行われます。

populateBean(beanName, mbd, instanceWrapper);

最終処理プロセス AutowiredAnnotationBeanPostProcessor の postProcessPropertyValues 関数で

metadata.inject(bean, beanName, pvs);

依存関係が事前に取得され、スローされているため、コンテナなので、ここではリフレクションを使用して直接書き込むことができます。

Bean の作成 4 番目のステップは Bean を初期化することです。ここにメソッド インジェクションがあります。メソッド インジェクションはもともと、 Bean が生成され、BeanPostProcessor の前後のライフ サイクル、初期化メソッドなどを含むライフ サイクル関数が実行されます。

簡単な説明: AutowiredAnnotationBeanPostProcessor は MergedBeanDefinitionPostProcessor と InstantiationAwareBeanPostProcessor の両方です

この記事は、php 中国語 Web サイトの

java チュートリアル

コラムからのものです。学習へようこそ!

以上がSpring がオブジェクトを挿入する方法と Bean 作成プロセスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。