【问题标题】:Spring Boot - Order of Bean creationSpring Boot - Bean 创建的顺序
【发布时间】: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


    【解决方案1】:

    不是 100% 确定,但是:

    1. 不,没有保证。
    2. 将初始化 A,然后初始化 B,因为您正在注入 A。
    3. 导入不保证顺序,只有你有一些不偷懒的注入

    检查 DependsOn 注释 (enter link description here)。

    希望对你有帮助

    【讨论】:

    • 感谢您的回答,但您的回答似乎与我上面从 Spring 文档中引用的内容相矛盾。如果没有保证,那么在添加任何用户定义的 bean 定义后保证加载自动配置类时所指的保证。
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 2016-07-05
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多