如何在 Spring Boot 中重新加载/重新初始化 Bean?

问题描述

我有这样的电子邮件配置类。

@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 内置功能来处理属性更改。 并且还可以为将来的目的进行扩展。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...