繁体   English   中英

使用spring-boot @ConditionalOnMissingBean的Spring配置类加载顺序?

[英]Spring configuration class loading order with spring-boot @ConditionalOnMissingBean?

我想使用@ConditionalOnMissingBean启用自定义配置和合理默认值? 我有一个春季启动应用程序:

@Configuration
@Import({CustomConfiguration.class, DefaultConfiguration.class})
@EnableAutoConfiguration(exclude={MetricFilterAutoConfiguration.class})
public class Application {

    @Autowired
    ErrorListener errorListener;
}

和一个允许Spring xml或组件扫描的CustomConfiguration

@Configuration("customConfiguration")
@ImportResource("classpath:customContext.xml")
@ComponentScan({"org.custom.impl"})
public class CustomConfiguration

DefaultConfiguration使用ConditionalOnMissingBean

@Bean
@ConditionalOnMissingBean 
ErrorListener errorListener() {
     return new LoggingErrorListener();
}

我想要实现的是允许在类路径中定义自定义ErrorListener ,如果没有定义,则使用默认的LoggingErrorListener (通过ConditionalOnMissingBean )。 我发现在CustomConfiguration之前始终使用DefaultConfiguration

我一直在试验@DependsOn@Order但没有快乐。

如果我是你,我不会在自动配置类之外使用@ConditionalOnMissingBean ,除非你可以控制@Configuration类的导入顺序。 自动配置是明确的,但普通的用户配置类(特别是如果它们是@ComponentSCanned )没有定义的顺序。

回应Daves回答:看起来它适用于不会干扰Spring Boot的独立bean。 例如,在为Spring Boot应用程序开发库时,如果应用程序开发人员不提供RestTemplate ,我想提供它。 @ConditionalOnMissingBean似乎有效:

@Bean
@ConditionalOnMissingBean(RestTemplate.class)
public RestTemplate restTemplate() {

    return new RestTemplate();
}

为了确认它是否能够一致地工作,我看了一下Spring的源代码(例如参见ConditionEvaluator )。 看来Spring在@ConditionalOnMissingBean跳过了使用@ConditionalOnMissingBean注释创建bean。 然后它将执行第二次传递来配置这些bean。

另外,我看到@ConditionalOnMissingBean行之有效的@Configuration类或@Beans配置类里面。 但它在其他地方不能正常工作,例如在使用@Component注释的@Component上或内部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM