Spring--依存注入ソース分析

5433 ワード

このブログを読んで、http://www.cnblogs.com/ITtangtang/p/3978349.html
次に,依存コードのエントリ方法を直接捉え,コードの実行構想を整理する.Spring jarパッケージバージョン4.2.6
コアコード:A b s t r a c t u t o w i reCapableBeanFactory.classコアメソッド:503行コードprotected Object doCreateBeanそのうち2行の主なコード:●510行instanceWrapper=createBeanInstance(beanName,mbd,args);●543行populateBean(beanName,mbd,instanceWrapper);
instanceWrapper = createBeanInstance(beanName, mbd, args);
メソッド解析アクセスメソッドcreateBeanInstance、このメソッドはBeanのインスタンスを作成するために使用され、springフレームワークをローカルに起動し、ここでブレークポイントSpring -- 依赖注入源码分析_第1张图片を打つ
上図の赤枠のコードから、クラスがインスタンス化されていることがわかります.
org.springframework.context.annotation.internalConfigurationAnnotationProcessor

さらにブレークポイントは、
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);

getInstantiationStrategy()メソッドは、CglibSubclassingInstantiationStrategy()を取得します.クラスC g l i b S u b c l a s i n g I n s t a n tiationStrategyは、SimpleInstantiationStrategyから親SimpleInstantiationStrategyのinstantiateメソッドを呼び出します.Spring -- 依赖注入源码分析_第2张图片上記の図のコードのようにBeanUtilsに実行する.instantiateClass(constructorToUse)、beanインスタンス化のコアSpring -- 依赖注入源码分析_第3张图片は、beanのインスタンス化プロセスを完了した.
populateBean(beanName, mbd, instanceWrapper);
依存注入がどのように行われているかを分析する.populateBeanメソッドでは、1226行のapplyPropertyValues(beanName,mbd,bw,pvs)が見つかりました.コードSpring -- 依赖注入源码分析_第4张图片
図を見ると、dataSourceというbean、propertyValueオブジェクトには12の属性が搭載されており、図中の矢印です.
1514行にジャンプsetPropertyValues(new MutablePropertyValues(deepCopy)); この行コードに導入されたdeepCopyは、次の図のようになります.
Spring -- 依赖注入源码分析_第5张图片
Spring -- 依赖注入源码分析_第6张图片
上図のよく知っている構成を見てみると、前の2つのコードがわかるかもしれません.
ここで、springはプロファイルに注入するBeanの取得を示し、ターゲットbeanのすべての属性値を取得することを理解しました.そしてbwを呼び出す.setPropertyValues.
見てみろsetPropertyValues,BeanWrapperはインタフェースであり、デフォルト実装クラスBeanWrapperImplは、次のように継承されていますSpring -- 依赖注入源码分析_第7张图片
setPropertyValueメソッドはAbstractPropertyAccessorクラスで実装されます.
Spring -- 依赖注入源码分析_第8张图片
上図はBeanのすべてのプロパティを巡回しています.A b s t r a c t NestablePropertyAccessorクラスで実行されるsetPropertyValueメソッドは、属性に対応する値を最終的に454行のph.setValue(this.wrappedObject,valueToApply)に格納します.で、PropertyHandlerは、テンプレートメソッドで実装される抽象クラスsetValueメソッドです.
这里写图片描述
実際に実行されているのはBeanPropertyHandlerクラスのsetValueメソッドです
Spring -- 依赖注入源码分析_第9张图片
反射によってターゲットメソッドが実行されることがわかります.最終的な属性注入が完了しました