Spring Boot @EnableAutoConfiguration 根据 属性 有条件地排除 class

Spring Boot @EnableAutoConfiguration exclude a class conditionally based on a property

是否可以从自动配置中排除 class 基于属性的值? 就我而言,我想禁用, MailSenderAutoConfiguration 在某些情况下。 例如, 假设我的 application.properties 中有这个 属性 app.email.disabled=true, 我想要这样的东西:

@SpringBootApplication
@EnableAutoConfiguration(exclude = MailSenderAutoConfiguration.class, ifProperty="app.email.disabled")
public class Application { .... }

我知道我可以声明一个 JavaMailSender 类型的 bean 并使用 @ConditionalOnProperty, 但我已经在 application.properties 和 我不想在 class.

中再次重复它们

尽管有 @ConditionalOnProperty 注释,但您无法控制 Spring 引导的 MailSenderAutoConfiguration

您可以将 spring.mail 属性移动到单独的 application-mail.yaml 文件中。仅当 Spring 具有活动的 mail 配置文件(例如 @ActiveProfiles("mail"))时才会加载它。如果没有此 mail 配置文件,默认 MailSenderAutoConfiguration 将看不到它们。

我为我的案例找到了一个解决方案,这不是最好的解决方案,但它有效。在 MailSenderAutoConfiguration class 中有这个嵌套的 class :

**
 * Condition to trigger the creation of a {@link JavaMailSenderImpl}. This kicks in if
 * either the host or jndi name property is set.
 */
static class MailSenderCondition extends AnyNestedCondition {...}

所以我刚刚评论了 spring.mail.host 属性,当我需要发送电子邮件时,我会取消评论。这不是最好的解决方案,因为我确信有一天我会忘记取消注释。 该解决方案适用于我的情况,但对于一般需求(任何自动配置)它不起作用。我希望在下一个 Spring 引导版本中看到此功能。

我遇到过与 JmsAutoConfiguration 类似的情况,我所做的是:

  1. 在主SpringBoot中排除class:
    @EnableAutoConfiguration(exclude = {ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
  1. 创建单独的配置 class:

@Configuration
@ConditionalOnProperty("application.queue.enabled")
@EnableJms
@ImportAutoConfiguration({ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
public class JmsConfiguration {
    ...

希望对您有所帮助..