Spring beanロード実行順序例解析
本論文で研究したのは主にSpring beanロードの実行順序に関する内容であり、具体的には以下の通りである。
問題のソース:
beanはAで、beanはBです。Aが容器を実例化する時の属性nameにBの一つの方法funBの戻り値を賦課したいです。
Aに単純に書いてあるだけなら、
解決策は次のコードで、springのInitializingBean、オブジェクト構造方法、init-methodの実行手順を勉強します。
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ロードの実行順序例解析の全部です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。
問題のソース:
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ロードの実行順序例解析の全部です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。