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

标签 java spring spring-mvc jakarta-mail spring-bean

我需要为每封发送的邮件创建一个使用数据库中的值初始化的 spring javamail bean。基于这篇文章,How to Load Application Properties from Database

我已将 PropertyPlaceholderConfigurer 配置为从属性文件和数据库加载值。我的 java 配置类中有以下 bean(mailSender),用于从我的应用程序发送邮件,该应用程序从数据库加载主机、端口、用户名和密码,

@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 bean 具有启动应用程序上下文时提供的旧值。对于对 bean 进行的任何更改,我需要重新启动服务器以更新 bean 值。

我将此 bean 注入(inject)到我的 Controller 中,我需要在其中发送这样的邮件,

@Autowired
private JavaMailSender mailSender;

根据一些建议,我尝试使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),但它没有创建新的bean定义(仍然具有旧值)。

所以我需要的是,每次使用此 mailSender bean 发送邮件时,它应该从数据库中选取值,而无需重新启动上下文或服务器。这可能吗?或者如何做到?

感谢任何帮助。谢谢。

类似问题:Spring: Refresh a bean created from code reading a database

最佳答案

我已经创建了一个自定义邮件服务实现,并按照 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 的新实例。

关于java - 如何使用数据库中的属性重新加载配置bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43868299/

相关文章:

java - java中的资源没有被释放

Spring MVC @pathvariable 注解不会将值从接口(interface)传递到实现

java - Spring Data 1.11.7 没有属性存在

java - 部署/托管 Spring Boot 应用程序

java - Spring - 从 JUnit 和 Maven 运行时的不同测试结果

java - 获取上下文的当前 url

java - 基于迁移数据的Spring服务层集成测试

java - 如何将一台服务器连接到多个客户端

java - 如果用户没有值,则在 JSP 中显示代码 - <c :choose> not working

javascript - 使用 Spring MVC 将值从 AJAX 传递到 Controller