如何使用数据库中的属性重新加载配置 bean
How to reload configuration bean with properties from database
我需要创建一个 spring javamail bean,并为每封发送的邮件使用数据库中的值进行初始化。基于这篇文章,How to Load Application Properties from Database
我已将 PropertyPlaceholderConfigurer
配置为从属性文件和数据库加载值。我的 java 配置 class 中有以下 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 注入我的控制器,我需要发送这样的邮件,
@Autowired
private JavaMailSender mailSender;
根据一些建议,我尝试使用 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
但它没有创建新的 bean 定义(仍然有旧值)。
所以我需要的是,每次使用这个 mailSender
bean 发送邮件时,它应该从数据库中选取值,而无需重新启动上下文或服务器。是否可能或如何完成?
感谢任何帮助。谢谢。
类似问题:Spring: Refresh a bean created from code reading a database
试试这个
public class CustomProperties extends Properties {
private final AppLogger logger = AppLogger.getInstance();
private static final long serialVersionUID = 1L;
private static final String GET_QUERY = "select config_value from config_params where config_key = ?";
private final JdbcTemplate jdbcTemplate;
public CustomProperties(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public String getProperty(String key) {
return jdbcTemplate.queryForObject(GET_QUERY, new Object[]{key}, String.class);
}
}
我创建了一个自定义邮件服务实现并按照 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
的新实例。
我需要创建一个 spring javamail bean,并为每封发送的邮件使用数据库中的值进行初始化。基于这篇文章,How to Load Application Properties from Database
我已将 PropertyPlaceholderConfigurer
配置为从属性文件和数据库加载值。我的 java 配置 class 中有以下 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 注入我的控制器,我需要发送这样的邮件,
@Autowired
private JavaMailSender mailSender;
根据一些建议,我尝试使用 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
但它没有创建新的 bean 定义(仍然有旧值)。
所以我需要的是,每次使用这个 mailSender
bean 发送邮件时,它应该从数据库中选取值,而无需重新启动上下文或服务器。是否可能或如何完成?
感谢任何帮助。谢谢。
类似问题:Spring: Refresh a bean created from code reading a database
试试这个
public class CustomProperties extends Properties {
private final AppLogger logger = AppLogger.getInstance();
private static final long serialVersionUID = 1L;
private static final String GET_QUERY = "select config_value from config_params where config_key = ?";
private final JdbcTemplate jdbcTemplate;
public CustomProperties(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public String getProperty(String key) {
return jdbcTemplate.queryForObject(GET_QUERY, new Object[]{key}, String.class);
}
}
我创建了一个自定义邮件服务实现并按照 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
的新实例。