#まずは大まかな実装を知る必要があります
● この注入プロセスは 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 サイトの他の関連記事を参照してください。