我对Spring中的 Autowiring 顺序和@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();
    }
}

我有以下输出:



我的问题是,自动布线是如何像上述方案一样逐步进行的?
以及如何在不先调用printMe()的情况下调用beanb@PostConstruct方法?

最佳答案

下面应该是可能的顺序

  • beanb开始自动连接
  • Beanb的类初始化期间,beana开始获取自动连接的
  • 一旦创建了beana,就会生成@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,即init()beanb称为
  • 然后System.out.println("beanb is called");被称为

  • 理想情况下,调试器可以在Eclipse中更好地观察到相同的结果。

    Spring reference manual解释了如何解决循环依赖性。首先实例化bean,然后将它们相互注入(inject)。

    07-26 01:51