Как функционально зарегистрировать Spring beans в @RefreshScope?

У меня есть ряд собственных нестандартных «стартовых» проектов. Я работаю над переходом на 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?

Интересный вопрос Джеффа. Жаль, никто не ответил, и жаль, что я тоже понятия не имею

LppEdd 09.02.2019 16:43
3
1
740
1

Ответы 1

Это может помочь - я пометил контроллер как 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

Другие вопросы по теме