我相信这应该很简单,但我想不通。
我有一个这样的配置类:
@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
公共类 MyMailConfiguration {
@Bean
@ConditionalOnBean(JavaMailSender.class)
public MyMailer myMailer(JavaMailSender javaMailSender) {
return new MyMailer(javaMailSender);
}
}
但 MyMailer 并未创建。如果我移除 ConditionalOnBean,JavaMailSender 将被注入,MyMailer 将被创建,但我希望条件存在,这样当我没有配置邮件时,它就不会崩溃。
剩下的唯一选择就是使用 ConditionalOnProperty,并观察 MailSenderAutoConfiguration 所做的相同属性,但这很糟糕。
遇到的问题是
@ConditionalOnBean
注解仅在应用程序上下文中已经存在
JavaMailSender
类型的 bean 时才会创建
MyMailer
bean。当没有配置邮件发送器时,
MailSenderAutoConfiguration
类就不会创建
JavaMailSender
bean,因此
MyMailer
bean 也不会被创建。
是对的,使用
ConditionalOnProperty
并检查
MailSenderAutoConfiguration
使用的相同属性不是一个优雅的解决方案。
为了解决这个问题,可以使用
@ConditionalOnClass
注解,而不是
@ConditionalOnBean
。
@ConditionalOnClass
注解仅在类路径上存在指定的类时才会创建 bean。
以下代码展示了如何使用
@ConditionalOnClass
注解:
@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
public class MyMailConfiguration {
@Bean
@ConditionalOnClass(JavaMailSender.class)
public MyMailer myMailer(JavaMailSender javaMailSender) {
return new MyMailer(javaMailSender);
}
}
使用
@ConditionalOnClass
注解,只要类路径上存在
JavaMailSender
类(无论是否配置了邮件发送器),
MyMailer
bean 就会被创建。如果未配置邮件发送器,则
javaMailSender
参数将为 null,因此需要在
MyMailer
构造函数或方法中处理这种情况。
以下是另一种解决方案,可以尝试使用
Optional
:
@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
public class MyMailConfiguration {
@Bean
public MyMailer myMailer(Optional<JavaMailSender> javaMailSender) {
return new MyMailer(javaMailSender.orElse(null));
}
}
使用这种方法,即使没有配置邮件发送器,
MyMailer
bean 也会被创建,并且
javaMailSender
参数将是
Optional.empty()
。 可以根据需要处理这种情况。
选择最适合需求的解决方案。
标签:spring-boot From: 57501215