【问题标题】:Spring configuration class loading order with spring-boot @ConditionalOnMissingBean?Spring配置类加载顺序与spring-boot @ConditionalOnMissingBean?
【发布时间】:2014-12-19 15:08:30
【问题描述】:

我想使用@ConditionalOnMissingBean 启用自定义配置和合理的默认值吗? 我有一个 Spring Boot 应用程序:

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

    @Autowired
    ErrorListener errorListener;
}

还有一个CustomConfiguration,它允许 Spring xml 或组件扫描:

@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)。我发现DefaultConfiguration 总是在CustomConfiguration 之前使用。

我一直在尝试@DependsOn@Order,但没有任何乐趣。

【问题讨论】:

  • 以什么 bean 为条件?名字?类型?您在@ConditionalOnMissingBean 中遗漏了匹配的部分。
  • 它默认为它所装饰的@Bean的类型。

标签: java spring spring-boot


【解决方案1】:

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

【讨论】:

  • 我一直在试验META-INF/spring.factories@AutoConfigureBefore({ DefaultAutoConfiguration.class}。 DefaultAutoConfiguration 仍然在 CustomAutoConfiguration 之前创建。我认为这是因为我的 Application 类有一个自动装配的属性,它在某种程度上优先于 AutoConfigureBefore
  • 这就是要走的路。并且自动装配应该与条件评估无关(必须在创建任何 bean 之前发生)。你能用你的新代码更新问题(或问一个新代码)吗?
  • 戴夫,在我上面的回答中,我已经把我的发现放在了上面。你从中看出什么漏洞吗?
【解决方案2】:

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

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

    return new RestTemplate();
}

为了确认它是否能始终如一地工作,我查看了 Spring 的源代码(例如,参见 ConditionEvaluator)。似乎 Spring 在第一遍中跳过了使用 @ConditionalOnMissingBean 注释创建 bean。然后它会做第二遍来配置这些 bean。

另外,我看到@ConditionalOnMissingBean@Configuration 类或@Beans 内部配置类上运行良好。但它在其他地方无法正常工作,例如在使用 @Component 注释的类上或类内。

【讨论】:

  • 这仍然对配置的注册顺序进行了假设。除非您使用自动配置,否则很难控制。它可能在您编写它时在测试中工作,但如果您的条件配置在具有预期覆盖的配置之前注册,它将失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2015-02-24
  • 2021-10-02
  • 2022-09-29
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多