Spring框架中Bean初始化与注入顺序咨询(@Autowired场景)
Spring Bean初始化与注入顺序详解
嘿,作为Spring新手碰到这种Bean注入顺序的问题太正常啦!我来给你把这个逻辑掰扯明白~
首先直接给你结论:正确的顺序是第二种情况,具体流程是:
- 创建B的实例(调用B的构造方法)
- 创建A的实例(调用A的构造方法)
- 将B注入到A的
b属性中
为什么是这个顺序?
Spring容器启动时,会先扫描所有标记了@Component的类,把它们注册成Bean定义。之后容器会解析每个Bean的依赖关系——因为你的A类里用@Autowired依赖了B,容器会明确知道:要创建A,必须先有B的实例,不然注入的时候就会找不到依赖。
所以容器会优先实例化被依赖的B,等B完全创建好(构造方法执行完毕),再去实例化A,最后把现成的B实例注入到A的b字段里。
额外补充:不同注入方式的小差异
如果是用构造方法注入(更推荐的方式),流程会更直接:
@Component class A{ private final B b; @Autowired // Spring 4.3+ 可以省略这个注解 public A(B b){ this.b = b; } }
这种情况下,容器必须先创建B的实例,才能调用A的构造方法来创建A,注入动作在A实例化的同时就完成了,顺序还是先B后A。
而你现在用的是字段注入,容器会先实例化A(调用无参构造),再把已经创建好的B注入到A的字段里,本质上依赖的优先级还是B更高。
内容的提问来源于stack exchange,提问作者ghostrider
相关产品推荐
相关产品推荐

