У меня есть приложение весенней загрузки. Я использую Spring Cloud Config для вывода свойств через Git. Все отлично работает
Я хотел бы, чтобы компоненты обновлялись при выдаче конечной точки обновления привода. Фасоль обновляется, как и ожидалось, выполняя следующие действия:
@EventListener
public void onRefreshScopeRefreshed(final RefreshScopeRefreshedEvent event) {
logger.info("Received Refresh event. Refreshing all beans...");
for (String beanName : applicationContext.getBeanDefinitionNames()) {
Class<?> beanClass = applicationContext.getBean(beanName).getClass();
if(beanClass.getName().contains("SpringCGLIB")) {
logger.info("Proxied bean: bean name: " + beanName + " - Bean class: " + applicationContext.getBean(beanName).getClass());
} else {
logger.info("Regular Bean: Bean name: " + beanName + " - Bean class: " + applicationContext.getBean(beanName).getClass());
}
applicationContext.getBean(beanName).getClass(); // to cause refresh eagerly
}
}
Единственное, что не работает должным образом, это когда я аннотирую класс Configuration с помощью @refreshScope (имеется в виду на уровне класса), бины, объявленные в этом классе, не обновляются, если они не имеют @RefreshScope в объявлении bean-компонента.
Здесь боб не обновляется:
@Configuration
@RefreshScope
public class DraftsClientConfiguration {
@Bean
MyBean aBean() {
return new MyBean();
}
}
Вот журнал из моего класса RefreshListener:
Мы видим, что в этом случае есть только один компонент, который не проксирован.
RefreshListener - Regular Bean: Bean name: draftsServiceClient - Bean class: class com.citi.qi.athena.drafts.DraftsServiceClient
Но здесь бин обновляется:
@Configuration
public class DraftsClientConfiguration {
@RefreshScope
@Bean
MyBean aBean() {
return new MyBean();
}
}
Во втором случае у нас есть два bean-компонента (должно быть, так), один с прокси и один без прокси.
RefreshListener - Regular Bean: Bean name: scopedTarget.draftsServiceClient - Bean class: class com.citi.qi.athena.drafts.DraftsServiceClient
RefreshListener - Proxied bean: bean name: draftsServiceClient - Bean class: class com.citi.qi.athena.drafts.DraftsServiceClient$$EnhancerBySpringCGLIB$$bbfd1caf
Я проверяю, обновлен компонент или нет, помещая точку останова в объявление компонента.
Согласно Spring doc, bean-компоненты должны обновляться аннотированием @RefreshScope на уровне класса конфигурации. Нет необходимости указывать @RefreshScope для каждого объявления бина класса конфигурации. Я что-то упустил?
Между прочим, я проверяю, обновлен ли компонент или нет, помещая точку останова в объявление компонента.
Второй вопрос: я думаю, у меня должен быть только один прокси-компонент, а не два, как мы видим во втором случае?