У меня есть ряд собственных нестандартных «стартовых» проектов. Я работаю над переходом на Spring Boot 2.0, Framework 5.0 и определение функционального компонента в этих и других местах.
В «начальных» проектах я следую шаблону определения функциональных компонентов с использованием org.springframework.context.ApplicationContextInitializer.
Пример класса конфигурации, пытающегося зарегистрировать bean-компонент в области «обновления».
package my.package;
public class MyConfiguration implements ApplicationContextInitializer<GenericApplicationContext> {
@Override
public void initialize(GenericApplicationContext context) {
context.registerBean(MyConfiguration.class);
context.registerBean("myBean",
MyBean.class,
() -> new MyBeanImpl(context.getBean(MyBeanDependency.class)),
bd -> bd.setScope("refresh"),
bd -> bd.setLazyInit(true));
}
}
Затем укажите этот MyConfiguration в файле META-INF/spring.factories как таковой.
# context init
org.springframework.context.ApplicationContextInitializer=\
my.package.MyConfiguration
Когда я пытаюсь запустить приложение с этим стартером в пути к классам, я вижу исключения при запуске, указывающие на отсутствие области обновления.
java.lang.IllegalStateException: No Scope registered for scope name 'refresh'
Я предполагаю, что это должно быть проблемой заказа. Значит, на момент создания моего bean-компонента RefreshScope еще не был создан? org.springframework.cloud.autoconfigure.RefreshAutoConfiguration - это то, что объявляет bean-компонент RefreshScope.
Есть ли хороший или предлагаемый способ функциональной регистрации компонентов Spring beans, которые должны быть в @RefreshScope?
Это может помочь - я пометил контроллер как RefreshScope, но получал эту ошибку -
DEBUG org.springframework.web.servlet.DispatcherServlet - Could not complete request java.lang.IllegalStateException: No Scope registered for scope name 'refresh'
Приведенный ниже фрагмент устраняет эту ошибку.
@DependsOn("refreshScope")
public CustomScopeConfigurer servletCustomScopeConfigurer(RefreshScope refreshScope) {
CustomScopeConfigurer customScopeConfigurer = new CustomScopeConfigurer();
customScopeConfigurer.addScope("refresh", refreshScope);
return customScopeConfigurer;
}
@Bean
public RefreshScope refreshScope(){
return new RefreshScope();
}
Ссылка: https://github.com/spring-cloud/spring-cloud-config/issues/1116
Интересный вопрос Джеффа. Жаль, никто не ответил, и жаль, что я тоже понятия не имею