2016-06-28 4 views
12

私は、自動配線オーダーと@PostConstructロジックについて、Springで質問しています。春のオートワイヤリングオーダーと@PostConstruct

@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(); 
    } 
} 

を、私は次の出力があります。

豆aが

と呼ばれているが

プリントビーンBで

beanbが


と呼ばれる私の質問は、オートワイヤリングは、上記のシナリオのようなステップで行わステップを取る方法ですか?
printMe()メソッドbeanbは、@PostConstructを先に呼び出さずに呼び出されますか?

以下

答えて

8

Beanbのクラスの初期化中

  • をautowired得るために

    1. beanb開始可能な順序でなければなりませんbeanaが@PostConstruct beanaのinit()つまりは
    2. 呼び出されます作成されます後は、beanaは
    3. をautowired取得を開始します
    4. 内側init()System.out.println("bean a is called");が呼び出されます。
    5. は次にb.printMe();System.out.println("print me is called in Bean B");を引き起こす呼び出さbeanabeanb@PostConstruct即ちinit()
    6. 呼び出さ終え
    7. 実行するそしてSystem.out.println("beanb is called");は、理想的には同じことが、より良い食にデバッガによって観察することができる

    呼び出されます。

    Spring reference manualは、循環依存性がどのように解決されるかを説明しています。豆は最初にインスタンス化され、次に互いに注入されます。

  • +1

    [リンク](https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/beans。 html#beans-dependency-resolution)を循環依存性解決に変換します。 –

    3

    お客様の質問に表示されているとおり、あなたの回答は正しいです。

    今すぐ表記@Autowiredの概念を得る。すべて@Autowiredオブジェクトは、クラスのロードが完了した直後に初期化され、メモリにロードされます。

    は今ここにあなたが持っているautowireとタイプBeanBのオブジェクトを注入しようとする書き込みコンソールアプリケーション上記でここにあなたのSpringBootApplication

    @SpringBootApplication 
    public class Demo1Application { 
        @Autowired 
        BeanB beanb; // You are trying to autowire a Bean class Named BeanB. 
    

    です。

    は今ここにあなたもあなたのコンソールプロジェクトで定義されているクラスBeanAのオブジェクトを注入しようとしているBeanB

    @Service 
    public class BeanB { 
    
        @Autowired 
        private BeanA beana ; 
    

    クラスBeanBでのあなたの定義です。

    したがって、Demo1Applicationには、オブジェクトBeanBを注入するには、クラスBeanAのオブジェクトを注入する必要があります。 今すぐBeanAクラスオブジェクトが最初に作成されます。今

    あなたは@PostContruct注釈付き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(); 
        } 
    } 
    

    あなたのクラスの定義を参照してください場合。

    ので、実行フローが可能になる。..

    System.out.println("bean a is called"); 
    System.out.println("print me is called in Bean B"); 
    System.out.println("beanb is called"); 
    
    関連する問題