Spring中依赖类构造函数为何先于被依赖类构造函数执行?
Spring中Setter注入时A先于B/C构造的底层逻辑
这完全是Spring容器处理Bean依赖与实例化的核心机制导致的,跟你调用getBean(B)的顺序没关系,具体逻辑如下:
- 依赖优先解析规则:Spring容器启动时会先扫描所有Bean的定义,构建完整的依赖关系图谱。不管你后续先获取哪个Bean,只要B依赖A,Spring就会把A标记为B的前置依赖——没有A的实例,后续无法通过setter给B注入依赖,所以必须先创建A。
- 单例Bean的预实例化特性:Spring默认的Bean作用域是
singleton,容器初始化阶段就会提前实例化所有单例Bean,而不是等到你调用getBean()的时候才去创建。所以当你启动容器的那一刻,Spring已经按照依赖顺序把A、B、C都创建好了,你调用getBean(B)只是拿已经存在的实例而已。 - Setter注入的执行时机:Setter注入是在Bean实例化(构造函数执行)之后才会执行的操作。也就是说,Spring的流程是:先实例化A(执行A的构造)→实例化B(执行B的构造)→调用B的setter方法注入A实例→实例化C(执行C的构造)→调用C的setter方法注入A实例。整个过程在容器初始化时就完成了,跟你后续获取Bean的顺序无关。
举个直白的流程例子:
容器启动 → 扫描到A、B、C的Bean定义 → 分析出B和C都依赖A → 先创建A实例 → 创建B实例 → 给B注入A → 创建C实例 → 给C注入A → 容器初始化完成 → 你调用
getBean(B),直接返回已创建好的B
内容的提问来源于stack exchange,提问作者Neeraj-Kumar-Coder
相关产品推荐
相关产品推荐

