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

时间:2018-07-13 20:45:00

标签: spring spring-boot spring-messaging

是否可以从自动配置中排除类 基于财产的价值? 就我而言,我想禁用 MailSenderAutoConfiguration。 例如, 说我在app.email.disabled=true中拥有application.properties这个属性, 我想要这样的东西:

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

我知道我可以声明JavaMailSender类型的bean 并使用@ConditionalOnProperty, 但我已经在中定义了所有电子邮件的属性 application.properties和 我不想在课堂上再重复一遍。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我为我的案子找到了解决方案,这不是最好的解决方案,但它可以工作。在MailSenderAutoConfiguration类中有一个嵌套类:

**
 * 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 Boot版本中可以看到此功能。

答案 2 :(得分:0)

我在JmsAutoConfiguration中有类似的案例,而我所做的是:

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

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

希望有帮助。