Springでの自動配線の順序と@PostConstruct
ロジックについて質問があります。たとえば、次のデモコードには、メインのSpring Bootクラスがあります。
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb;
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
および2 @Service
定義:
@Service
public class BeanB {
@Autowired
private BeanA beana ;
@PostConstruct
public void init(){
System.out.println("beanb is called");
}
public void printMe(){
System.out.println("print me is called in Bean B");
}
}
@Service
public class BeanA {
@Autowired
private BeanB b;
@PostConstruct
public void init(){
System.out.println("bean a is called");
b.printMe();
}
}
そして、私は次の出力を持っています:
bean aと呼ばれる
プリントBは、Bean Bで呼び出されます
beanbが呼び出されます
私の質問は、上記のシナリオのように、ステップごとに自動配線が行われる方法ですか?
そして、最初に@PostConstruct
を呼び出さずにbeanb
のprintMe()
メソッドを呼び出す方法は?
以下は可能なシーケンスでなければなりません
beanb
は自動配線を開始しますBeanb
のクラス初期化中に、ビーナは自動配線を開始します@PostConstruct
_つまりbeanaのinit()
が呼び出されますinit()
内で、System.out.println("bean a is called");
が呼び出されますb.printMe();
が呼び出され、System.out.println("print me is called in Bean B");
が実行されますbeana
が_@PostConstruct
_を完了すると、つまりbeanb
のinit()
が呼び出されますSystem.out.println("beanb is called");
が呼び出されます理想的には、Eclipseのデバッガーでも同じことがよく観察できます。
Springリファレンスマニュアル では、循環依存関係の解決方法について説明しています。 Beanは最初にインスタンス化され、次に相互に注入されます。
あなたの質問に示したとおり、あなたの答えは正しいです。
表記法@Autowired
の概念を取得します。すべての@Autowired
オブジェクトは、クラスの読み込みが完了した直後に初期化され、メモリに読み込まれます。
これがSpringBootApplication
です
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb; // You are trying to autowire a Bean class Named BeanB.
上の上記のコンソールアプリケーションで、タイプBeanB
のオブジェクトを自動配線して挿入しようとします。
これがBeanB
の定義です
@Service
public class BeanB {
@Autowired
private BeanA beana ;
BeanB
クラスでは、コンソールプロジェクトでも定義されているBeanA
クラスのオブジェクトを挿入しようとしています。
したがって、Demo1Application
クラスのオブジェクトBeanB
を注入するには、BeanA
クラスのオブジェクトを注入する必要があります。これで、BeanA
クラスオブジェクトが最初に作成されます。
クラスの定義が表示されたらBeanA
@Service
public class BeanA {
@Autowired
private BeanB b;
@PostConstruct // after Creating bean init() will be execute.
public void init(){
System.out.println("bean a is called");
b.printMe();
}
}
そのため、オブジェクトを挿入した後、BeanA
メソッド@PostContruct
アノテーションを使用してバインドを実行します。
したがって、実行フローは...
System.out.println("bean a is called");
System.out.println("print me is called in Bean B");
System.out.println("beanb is called");