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 类似的情况,我所做的是:
- 在主SpringBoot中排除class:
@EnableAutoConfiguration(exclude = {ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
- 创建单独的配置 class:
@Configuration
@ConditionalOnProperty("application.queue.enabled")
@EnableJms
@ImportAutoConfiguration({ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
public class JmsConfiguration {
...
希望对您有所帮助..
是否可以从自动配置中排除 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 类似的情况,我所做的是:
- 在主SpringBoot中排除class:
@EnableAutoConfiguration(exclude = {ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
- 创建单独的配置 class:
@Configuration
@ConditionalOnProperty("application.queue.enabled")
@EnableJms
@ImportAutoConfiguration({ActiveMQAutoConfiguration.class,JmsAutoConfiguration.class})
public class JmsConfiguration {
...
希望对您有所帮助..