Spring中@Import导入的配置类内所有Bean都会被实例化吗?
结论
不会仅因为Bean x被实例化就触发B中所有定义的Bean实例化,具体的实例化逻辑由Bean的作用域、懒加载配置、依赖关系共同决定。
1. 默认配置场景(单例作用域、未配置懒加载)
Spring默认会在容器启动阶段预实例化所有单例Bean,不管这些Bean是否被其他Bean依赖。这种情况下B中定义的所有单例Bean都会在容器启动时完成实例化,并不是在x实例化时才触发。
涉及的配置类代码如下:
// A.java @Configuration @Import(B.class) class A { @Bean public X x(Y y) { return new X(y); } }
// B.java @Configuration class B { @Bean public Y y() { return new Y(); } // 还定义了其他若干Bean }
2. 非预实例化场景(配置了懒加载/Bean为非单例作用域)
如果B中的Bean单独标注了@Lazy、全局开启了懒加载配置,或者Bean的作用域是prototype、request等非单例类型,那么Bean的实例化会推迟到第一次被使用时才触发。
此时如果只有x依赖B中的Y实例,没有其他Bean依赖B中定义的其他Bean,也没有代码显式获取这些Bean,那么Spring只会实例化Y来满足x的依赖,B中其他的Bean不会被实例化。
@Import的作用说明
@Import(B.class)的核心作用是将B配置类注册到Spring容器中,让Spring可以解析B中定义的Bean声明,它本身不会强制触发B中所有Bean的实例化,Bean的实例化规则和普通的配置类完全一致。
内容的提问来源于stack exchange,提问作者Ajay Sabarish
相关产品推荐
相关产品推荐

