Как перезагрузить / повторно инициализировать компонент в Spring boot?

#java #spring #spring-bean

#java #весна #spring-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? Я обновил ConfigService, но значение компонента не изменилось.

Ответ №1:

У вас есть три варианта обновления одноэлементного компонента в контексте spring, вы можете выбрать один, подходящий для вашего варианта использования:

Метод перезагрузки в компоненте Создайте метод в вашем компоненте, который обновит / перезагрузит его свойства. На основе вашего триггера получите доступ к компоненту из контекста spring, а затем вызовите метод reload для обновления свойств компонента (начиная с одноэлементного), он также будет обновляться в контексте spring и везде, где он автоматически подключен / введен.

Удалить и зарегистрировать компонент в реестре Вы можете использовать DefaultSingletonBeanRegistry для удаления и повторной регистрации вашего компонента. Единственным недостатком этого является то, что он не будет обновлять / перезагружать старый экземпляр уже автоматически подключенного / внедренного компонента в потребительских классах.

 DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getBeanFactory();
registry.destroySingleton({yourbean}) //destroys the bean object
registry.registerSingleton({yourbeanname}, {newbeanobject}) //add to singleton beans cache
 

@RefreshScope
Полезно для обновления свойств значения компонента из изменений конфигурации. Но у него очень ограниченная и специфическая цель. Ресурс, чтобы узнать больше об этом.

Дайте мне знать, если это поможет.

Комментарии:

1. Можете ли вы объяснить метод перезагрузки в компоненте?

Ответ №2:

Существует способ обработки обновления свойств в Spring boot. Пожалуйста, проверьте это один раз — https://www.baeldung.com/spring-reloading-properties .

Это позволит использовать встроенные возможности spring для обработки изменений свойств. И будет расширяться и для будущих целей.