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

Spring Boot@EnableAutoConfiguration根据属性有条件地排除类,spring,spring-boot,spring-messaging,Spring,Spring Boot,Spring Messaging,是否可以从自动配置中排除类 基于财产的价值? 在我的情况下,我想禁用, 在某些情况下,MailSenderAutoConfiguration。 例如 假设我在我的application.properties中有此属性app.email.disabled=true, 我想要这样的东西: @SpringBootApplication @EnableAutoConfiguration(exclude = MailSenderAutoConfiguration.class, ifProperty="ap

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

@SpringBootApplication
@EnableAutoConfiguration(exclude = MailSenderAutoConfiguration.class, ifProperty="app.email.disabled")
public class Application { .... }
我知道我可以声明类型为
JavaMailSender
并使用
@ConditionalOnProperty
, 但我已经在中定义了所有电子邮件的属性
application.properties
和 我不想在类中重复它们。

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


您可以将
spring.mail
属性移动到一个单独的
应用程序mail.yaml
文件中。仅当Spring具有活动的
邮件
配置文件(例如
@ActiveProfiles(“邮件”)
)时,才会加载它。如果没有此
邮件
配置文件,默认的
邮件发送自动配置
将看不到它们。

我为我的案例找到了一个解决方案,这不是最好的解决方案,但很有效。在
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引导版本上看到此功能。

我与JmsAutoConfiguration有类似的情况,我所做的是:

  • 在主SpringBoot类中排除:
  • 创建单独的配置类:

  • 希望能有所帮助。

    这在我的情况下不起作用,因为我有许多属性文件,它们是根据活动配置文件启用的。如果我添加新的属性文件,我的应用程序将崩溃。除了声明我自己的bean,我没有其他选择。我快速查看了
    MailSenderAutoConfiguration
    的代码,我完全可以控制Spring Boot创建的bean,因为它的属性基于application.properties中定义的属性。@akuma8如果为非活动配置文件添加新属性文件会使你的应用程序崩溃,那么你就有一个bug。问题是当配置文件崩溃时将处于活动状态,因为在我的应用程序中我有以下内容:
    @PropertySource(value={“classpath:securityservice/security-${spring.profiles.active}.properties”})
    因此当
    邮件
    配置文件处于活动状态时,将找不到文件
    安全邮件.properties
        @EnableAutoConfiguration(exclude = {ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
    
    
    @Configuration
    @ConditionalOnProperty("application.queue.enabled")
    @EnableJms
    @ImportAutoConfiguration({ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
    public class JmsConfiguration {
        ...