#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 для обработки изменений свойств. И будет расширяться и для будущих целей.