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

8zzbczxx  于 2023-01-12  发布在  Spring
关注(0)|答案(4)|浏览(132)

是否可以根据属性的值从自动配置中排除一个类?在我的例子中,我想禁用MailSenderAutoConfiguration。例如,假设我在application.properties中有这个属性app.email.disabled=true,我想这样做:

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

我知道我可以声明JavaMailSender类型的bean并使用@ConditionalOnProperty,但是我已经在application.properties中定义了email的所有属性,我不想在类中重复它们。

cs7cruho

cs7cruho1#

尽管有@ConditionalOnProperty注解,但您无法控制Sping Boot 的MailSenderAutoConfiguration
您可以将spring.mail属性移到一个单独的application-mail.yaml文件中。只有当Spring有一个活动的mail配置文件(例如@ActiveProfiles("mail"))时,它才会被加载。没有这个mail配置文件,默认的MailSenderAutoConfiguration将看不到它们。

q7solyqu

q7solyqu2#

我有类似的JmsAutoConfiguration案例,我所做的是:
1.在主SpringBoot类中排除:

@EnableAutoConfiguration(exclude = {ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})

1.创建单独的配置类:

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

希望能有所帮助。

k4ymrczo

k4ymrczo3#

我为我的情况找到了一个解决方案,这不是最好的解决方案,但它是有效的。在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属性,当我需要发送电子邮件时,我会取消注解它。这不是最好的解决方案,因为我相信有一天我会忘记取消注解它。这个解决方案在我的情况下工作,但对于一般需要(任何自动配置),它不会工作。我希望在下一个Sping Boot 版本中看到这个功能。

tjjdgumg

tjjdgumg4#

要按属性禁用自动配置,您可以创建如下所示的排除器配置;

@Configuration
    @ConditionalOnProperty(prefix = "app.email", value = "enabled", havingValue = "false")
    @EnableAutoConfiguration(exclude = {MailSenderAutoConfiguration.class})
    public class MailSenderAutoConfigurationExcluder {}

相关问题