Spring autowiring order and @PostConstruct

梦想的初衷 提交于 2019-12-02 16:17:59
Mudassar

Below should be possible sequence

  1. beanb starts to get autowired
  2. During class initialization of Beanb, beana starts to get autowired
  3. Once beana gets created the @PostConstruct i.e. init() of beana gets called
  4. Inside init(), System.out.println("bean a is called"); gets called
  5. Then b.printMe(); gets called causing System.out.println("print me is called in Bean B"); to execute
  6. Having the beana completed the @PostConstruct i.e. init() of beanb gets called
  7. Then System.out.println("beanb is called"); gets called

Ideally the same can be better observed by a debugger in eclipse.

The Spring reference manual explains how circular dependencies are resolved. The beans are instantiated first, then injected into each other.

Your Answer is Correct as you shown in Your question.

Now Getting the concept of Notation @Autowired. All @Autowired Objects are initialized and loaded in memory just after class Loading is done.

Now here is your SpringBootApplication

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

Here at above Console Application that you have write try to autowire and inject a object of type BeanB.

Now here is your definition of BeanB

@Service
public class BeanB {

    @Autowired
    private BeanA beana ;

In BeanB class you are trying to inject the Object of Class BeanA which is also defined in your console Project.

So, In Your Demo1Application to inject a Object of Class BeanB there must need to inject a Object of class BeanA. Now BeanA Class Object is Created First.

Now if you see the definition of Your Class 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();
    }
}

So, After injecting the Object BeanA method bind with @PostContruct annotation is going to execute.

So, execution flow will be..

System.out.println("bean a is called");
System.out.println("print me is called in Bean B");
System.out.println("beanb is called");
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!