我需要为发送的每封邮件创建一个spring database java bean,该bean使用数据库中的值进行初始化。根据这篇文章How to Load Application Properties from Database
我已将mailSender
配置为从属性文件和数据库加载值。我的java配置类中有以下bean(@Configuration
public class MailSenderConfig {
@Bean
public JavaMailSender mailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(PropertiesUtils.getProperty("mail.server.host"));
javaMailSender.setPort(Integer.parseInt(PropertiesUtils.getProperty("mail.server.port")));
javaMailSender.setUsername(PropertiesUtils.getProperty("mail.server.username"));
javaMailSender.setPassword(PropertiesUtils.getProperty("mail.server.password"));
return javaMailSender;
}
}
),用于从我的应用程序发送邮件,从数据库加载主机,端口,用户名和密码,
mailSender
但我的问题是当数据库值发生变化时,@Autowired
private JavaMailSender mailSender;
bean具有在启动应用程序上下文时提供的旧值。对于bean的任何更改,我需要重新启动服务器以更新bean值。
我在我的控制器中注入了这个bean,我需要发送这样的邮件,
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
根据一些建议,我尝试使用mailSender
,但它没有创建新的bean定义(仍有旧值)。
所以我需要的是,每次使用这个Model::from
bean发送邮件时,它都应该从数据库中选择值而不重新启动上下文或服务器。有可能或如何做到这一点?
感谢任何帮助。感谢。
类似的问题:Spring: Refresh a bean created from code reading a database
答案 0 :(得分:0)
我已经按照JB Nizet的建议创建了自定义邮件服务实现并删除了邮件发件人bean。在服务实现中,我从数据库中读取属性,并在每次从应用程序发送邮件时创建新实例。如下所示
@Autowired
private MailSender mailSender;
JavaMailSenderImpl jms = mailService.createMailSender();
MimeMessage mimeMessage = new MimeMessage(mailService.getMailSession(jms));
MimeMessageHelper message = null;
message.setSubject("Test mail");
message.setTo("email@domain.com");
message.setText(htmlContent, true);
Transport.send(message);
其中createMailSender()
为您发送的每封邮件创建JavaMailSenderImpl
的新实例。