我相信这应该很简单,但我无法弄清楚。
我有一个这样的配置类:
@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
public class MyMailConfiguration {
@Bean
@ConditionalOnBean(JavaMailSender.class)
public MyMailer myMailer(JavaMailSender javaMailSender) {
return new MyMailer(javaMailSender);
}
}
但是MyMailer没有创建。如果我删除ConditionalOnBean,则会注入JavaMailSender并创建MyMailer,但是我希望在那儿建立条件,因此当我没有配置邮件时,它不会崩溃。
剩下的唯一选择是使用ConditionalOnProperty并监视与MailSenderAutoConfiguration相同的属性,但是很臭。
答案 0 :(得分:1)
问题是@AutoConfigureAfter无法按预期工作。 看到 @AutoConfigureAfter not working as desired
在处理MyMailConfiguration时,没有保证已经从MailSenderAutoConfiguration创建了所有bean。因此ConditionalOnBean无法正常工作(bean尚不存在)。 当没有ConditionalOnBean anno时,Spring会正确理解Bean创建顺序图。
我为您的问题写了一个样本:
@Configuration
public class RootConfig {
@PostConstruct
public void post(){
System.out.println("RootConfig processed");
}
@Bean
public RootMailer rootMailer(){
System.out.println("Root bean created");
return new RootMailer();
}
}
@Configuration
@AutoConfigureAfter(RootConfig.class)
public class MyConfig {
@PostConstruct
public void post(){
System.out.println("MyConfig processed");
}
@Bean
// @ConditionalOnBean(RootMailer.class)
public MyMailer myMailer(RootMailer javaMailSender) {
System.out.println("MyMail bean created");
return new MyMailer(javaMailSender);
}
}
其中 RootConfig == MailSenderAutoConfiguration,RootMailer == JavaMailSender
发电输出:
MyConfig processed
RootConfig processed
Root bean created
MyMail bean created
如果取消注释@ConditionalOnBean,则顺序将保持不变,但在nono处理时刻该bean将不存在。