问题描述
@Configuration
public class EmailConfiguration {
@Autowired
private ConfigService configService;
@Bean
public JavaMailSender JavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(configService.emailHost());
mailSender.setPort(configService.emailPort());
mailSender.setUsername(configService.emailAddress());
mailSender.setPassword(configService.emailPassword());
return mailSender;
}
}
如何在每次刷新 ConfigService 时让这个 bean 在运行时改变值?我正在刷新 ConfigService 但 bean 的值没有改变。
解决方法
您有三个选项可以在 spring 上下文中更新单例 bean,您可以选择一个适合您的用例:
Bean 中的 Reload 方法 在您的 bean 中创建一个方法,它将更新/重新加载其属性。根据您的触发器,从 spring 上下文访问 bean,然后调用 reload 方法来更新 bean 属性(自单例以来)它也将在 spring 上下文中以及它自动装配/注入的任何地方进行更新。
在注册表中删除和注册Bean 您可以使用 DefaultSingletonBeanRegistry 删除并重新注册您的 bean。唯一的缺点是,它不会刷新/重新加载消费者类中已经自动装配/注入的 bean 的旧实例。
DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getBeanFactory();
registry.destroySingleton({yourbean}) //destroys the bean object
registry.registerSingleton({yourbeanname},{newbeanobject}) //add to singleton beans cache
@RefreshScope 用于从配置更改刷新 bean 值属性。但它的用途非常有限且特定。阅读更多相关资源。
如果这有帮助,请告诉我。
,Spring Boot 中有一种处理属性刷新的方法。 请检查一次 - https://www.baeldung.com/spring-reloading-properties。
这将利用 spring 内置功能来处理属性更改。 并且还可以为将来的目的进行扩展。