Spring beanロード実行順序例解析


本論文で研究したのは主にSpring beanロードの実行順序に関する内容であり、具体的には以下の通りである。
問題のソース:
beanはAで、beanはBです。Aが容器を実例化する時の属性nameにBの一つの方法funBの戻り値を賦課したいです。
Aに単純に書いてあるだけなら、private B b;
private String name = b.funb();
null pointExceptionと間違えて言います。この時はbがセットに入っていないので、nullです。
解決策は次のコードで、springのInitializingBean、オブジェクト構造方法、init-methodの実行手順を勉強します。

public class A implements InitializingBean {
	private B b;
	private String name;
	// = b.funb(); 
	public void setB(B b) {
		System.out.println("A.setB initialed");
		this.b = b;
	}
	public A() {
		System.out.println("A initialed");
	}
	public void init() {
		System.out.println("init");
		this.name = b.funb();
	}
	@Override 
	 public String toString() {
		return super.toString() + this.name;
	}
	public void afterPropertiesSet() throws Exception {
		//          
		//this.name = b.funb(); 
		System.out.println("afterPropertiesSet");
	}
}
public class B {
	public String funb() {
		System.out.println("funb");
		return "B.funb";
	}
	public B() {
		System.out.println("B initialed");
	}
}
springプロファイル

<beans default-autowire="byName">
   <bean id="a" class="testspring.A" init-method="init">
   </bean>
   <bean id="b" class="testspring.B">
   </bean>
 </beans>
テストコード:

public static void main(String[] args) {
	ApplicationContext context = new FileSystemXmlApplicationContext(
	     "src/testspring/bean.xml");
	A a = (A) context.getBean("a");
	System.out.println(a);
}
プログラム出力:
A initialed
B initialed
A.setB initialed
after Propertiesset
init
ふふふnb
[email protected]
ここからAのname属性はbeanロードが完了するとBのfunBメソッドの戻り値に設定されます。ポイントはinit-methodで実現されます。
ロード順序は、次のようにも見えます。
まずコンストラクタ->そしてbのset方法を注入します。
まとめ:
以下の内容は本から抜粋したものですが、抜粋しても内容の理解はさらに深まります。
一、Spring組立ビーンの過程
1.実用化
2.属性値の設定
3.ビーンNameAwareインターフェースを実現したら、setBeanNameを呼び出してビーンのIDまたはNameを設定します。
4.BenFactoryAwareインターフェースを実現すれば、setBenFactory設定BenFactoryを呼び出します。
5.Application Contect Awareを実現すれば、setApple plication Contectを呼び出してAppplication Comptextを設定します。
6.BenPostProcessorの初期化方法を呼び出します。
7.InitializingBenのafterPropertiessetを呼び出す()方法。
8.カスタマイズinit-methodの方法を呼び出します。
9.BenPostProcessorを呼び出した後の初期化方法。
Spring容器閉鎖過程
1.DispposableBenのdestroyを呼び出します。
2.カスタマイズしたdestroy-methodの方法を呼び出します。
一、シングルビーム
読み込み
1.実用化
2.属性値の設定
3.ビーンNameAwareインターフェースを実現したら、setBeanNameを呼び出してビーンのIDまたはNameを設定します。
4.BenFactoryAwareインターフェースを実現すれば、setBenFactory設定BenFactoryを呼び出します。
5.Application Contect Awareを実現すれば、setApple plication Contectを呼び出してAppplication Comptextを設定します。
6.BenPostProcessorの初期化方法を呼び出します。
7.InitializingBenのafterPropertiessetを呼び出す()方法。
8.カスタマイズinit-methodの方法を呼び出します。
9.BenPostProcessorを呼び出した後の初期化方法。
スプリング容器閉鎖
1.DispposableBenのdestroyを呼び出します。
2.カスタマイズしたdestroy-methodの方法を呼び出します。
二、複数のビームの先着順
BenPostProcessorの実装を優先的にロードするBean
BeanファイルとBeanの定義順にbeanのロード順である(複数のspringファイルをロードしてもidカバーがある)
「属性値の設定」(2ステップ目)において、refに遭遇した場合は、「インスタンス化」(1ステップ目)の後に、refのidに対応するbeanを先にロードします。
Abstract FactoryBenのサブクラスは、6ステップ目以降、createInstanceメソッドを呼び出し、その後get Object Typeメソッドを呼び出します。
BenFactoryUtils類もBeanのロード順序を変えます。
締め括りをつける
以上が本文のSpring beanロードの実行順序例解析の全部です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。