【发布时间】:2019-12-25 02:18:59
【问题描述】:
Spring Boot 应用程序中是否有任何默认的 bean 初始化顺序?尝试使用 @ConditionalOnBean 注释时,我在我的一个 Spring Boot 应用程序中遇到了这个问题。
起初,我认为 Spring 在 @Configuration 类中加载 bean 或在进行组件扫描以自动注册 @Component/@Service/.. 类时不保证任何 Bean 创建顺序。
但后来,我注意到Spring documentation中提到了,
保证在添加任何用户定义的 bean 定义后加载自动配置类。
不知怎的,这让我感到困惑,
1. 什么算用户定义的bean,什么算自动配置类?具体来说,@Configuration 类中的 @Bean 和类级别的 @Component/@Service 之间是否有任何加载顺序。
2.如果一个bean A需要bean B的依赖注入,B总是先初始化吗?
3、如果Spring Boot应用中使用@Import进行配置聚合,在组件扫描bean注册之前,是否会初始化导入的配置类中定义的bean。
@Component
public class A {}
@Component
public class B {
@Autowired
private A a;
}
@Configuration
public class externalConfig {
@Bean
public C c() {
return new C();
}
}
@SpringBootApplication
@Import(externalConfig.class)
public class testApplication {
@Bean
public D d() {
return new D();
}
}
当谈到上面的代码示例时,我的问题变成了以下。
1.没有@Import,C或D总是会先于A和B初始化吗?
2. B 总是在 A 之前初始化吗?
3. 使用@Import,C 是否总是首先被初始化,就像在 D 之前一样?
【问题讨论】:
标签: spring spring-boot