gpt4 book ai didi

spring-boot - Spring boot - 仅当 bean JavaMailSender 存在时才自动配置

转载 作者:行者123 更新时间:2023-12-04 15:42:06 25 4
gpt4 key购买 nike

我相信这应该很简单,但我想不通。

我有一个这样的配置类:

@Configuration
@AutoConfigureAfter(MailSenderAutoConfiguration.class)
public class MyMailConfiguration {

@Bean
@ConditionalOnBean(JavaMailSender.class)
public MyMailer myMailer(JavaMailSender javaMailSender) {
return new MyMailer(javaMailSender);
}
}

但是 MyMailer 没有被创建。如果我删除 ConditionalOnBean,JavaMailSender 将被注入(inject)并创建 MyMailer,但我想要那里的条件,所以当我没有配置邮件时,它不会崩溃。

剩下的唯一选择是使用 ConditionalOnProperty 并观察与 MailSenderAutoConfiguration 相同的属性,但这很糟糕。

最佳答案

问题是@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 的注释,顺序将保持不变,但该 bean 在处理时刻将不存在。

关于spring-boot - Spring boot - 仅当 bean JavaMailSender 存在时才自动配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57501215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com