![](/img/trans.png)
[英]Is it possible to create a custom condition equivalate of @ConditionalOnMissingBean with Spring (no spring-boot)?
[英]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.