如何使用数据库中的属性重新加载配置Bean

时间:2017-05-09 11:12:44

标签: java spring spring-mvc javamail spring-bean

我需要为发送的每封邮件创建一个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

1 个答案:

答案 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的新实例。