Spring Boot-Bean创建顺序

时间:2019-08-19 21:00:44

标签: spring spring-boot

Spring Boot应用程序中是否暗含任何默认的bean初始化顺序?尝试使用@ConditionalOnBean注释时,我在一个Spring Boot应用程序中遇到了这个问题。

起初,我认为当Spring在@Configuration类中加载bean或进行组件扫描以自动注册@ Component / @ Service / ..类时,Spring不保证任何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,将始终像在D之前一样先初始化C吗?

1 个答案:

答案 0 :(得分:0)

不确定100%,但是:

  1. 没有保证。
  2. 先初始化A,然后再初始化B,因为您要注入A。
  3. 仅当您进行了一些非延迟注射时,导入并不保证顺序

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

希望它对您有帮助