Spring Boot-仅在存在bean JavaMailSender时自动配置

时间:2019-08-14 19:55:59

标签: spring-boot

我相信这应该很简单,但我无法弄清楚。

我有一个这样的配置类:

@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相同的属性,但是很臭。

1 个答案:

答案 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将不存在。