この記事では、主に、次のように、春の豆荷重実行順序の関連する内容を研究しています。
問題の原因:
aとBの豆があります。Aがインスタンス化されたら、Bの返品値にメソッドファンにプロパティ名を割り当てたいと思います。
それがただ書かれている場合:
private B b;
private String name = b.funb();
エラーが報告され、NullpointExceptionはBが現時点で設定されていないため、NULLです。
ソリューションは次のようにコードであり、同時に、春のbeanを初期化するbean、オブジェクト構築方法、およびinit-methodの実行順序を学習します。
パブリッククラスAは、InitializingBeanを実装します{private b b; private string name; // = b.funb(); public void setb(b b){system.out.println( "a.setb initialized"); 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 hiritioned");}}}}}スプリング構成ファイル
<beans default-autowire = "byname"> <bean id = "a" init-method = "init"> </bean> <bean id = "b"> </bean> </bean>
テストコード:
public static void main(string [] args){applicationContext context = new FilesystemxmlapplicationContext( "src/testspring/bean.xml");プログラムの出力は次のとおりです。
イニシャル
Bイニシャル
a.setbイニシャル
AfterPropertiesset
init
ファン
[email protected]
ここから、Aの名前属性が、BeanがロードされたときにBのFUNBメソッドの返品値に正常に設定されていることがわかります。重要なポイントは、init-methodを使用して実装することです。
読み込み順序は次のように見ることができます。
first constructor-> then bセットメソッドインジェクション - >初期化後のandpropertiessetメソッド - > init -methodメソッド
次のコンテンツは本から抜粋していますが、たとえそれを一度抜粋しても、そのコンテンツについての私の理解はより詳細になることがわかりました!
1。スプリングアセンブリ豆のプロセス
1。インスタンス;
2。属性値を設定します。
3. Beannameawareインターフェイスが実装されている場合は、setBeanNameを呼び出してBean IDまたは名前を設定します。
4. BeanFactoryAwareインターフェイスを実装する場合は、SetBeanFactoryを呼び出してBeanFactoryを設定します。
5.アプリケーションContextAwareが実装されている場合、setApplicationContextを呼び出してApproachContextを設定します
6.ビーンポストプロセッサの前向き化方法を呼び出します。
7。abherpropertiesset()初期化の方法を呼び出します。
8。カスタマイズされたinit-methodメソッドを呼び出します。
9。BeanPostProcessorの開始後の方法を呼び出します。
スプリングコンテナシャットダウンプロセス
1。DasusableBeanDestroy()を呼び出します。
2。カスタマイズされたDestroy-Methodメソッドを呼び出します。
1。単一豆
負荷
1。インスタンス;
2。属性値を設定します。
3. Beannameawareインターフェイスが実装されている場合は、setBeanNameを呼び出してBean IDまたは名前を設定します。
4. BeanFactoryAwareインターフェイスを実装する場合は、SetBeanFactoryを呼び出してBeanFactoryを設定します。
5.アプリケーションContextAwareが実装されている場合、setApplicationContextを呼び出してApproachContextを設定します
6.ビーンポストプロセッサの前向き化方法を呼び出します。
7。abherpropertiesset()初期化の方法を呼び出します。
8。カスタマイズされたinit-methodメソッドを呼び出します。
9。BeanPostProcessorの開始後の方法を呼び出します。
スプリングコンテナ近く
1。DasusableBeanDestroy()を呼び出します。
2。カスタマイズされたDestroy-Methodメソッドを呼び出します。
2。複数の豆の順序
BeanPostProcessor実装Beanの負荷を優先します
豆の定義の順に、豆の負荷の順序(複数のスプリングファイルをロードするときにID上書きがある場合でも)
「属性値を設定する」(ステップ2)の場合、REFに遭遇すると、REFのIDに対応するBeanが「インスタンス化」(ステップ1)の後に最初にロードされます。
AbstractFactoryBeanのサブクラスは、ステップ6の後にCreateInstanceメソッドを呼び出し、GetObjectTypeメソッドが呼び出されます。
BeanFactututilsクラスは、豆の負荷順序も変更します。
上記は、Spring Beanロードの実装順序に関するこの記事のすべての内容であり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!