我有一些自己定制的“入门”项目 . 我正在努力迁移到Spring Boot 2.0,Framework 5.0以及这些和其他地方的功能bean定义 .

在"starter"项目中,我为功能bean定义所遵循的模式使用 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));
    }
}

然后,在 META-INF/spring.factories 文件中列出此 MyConfiguration .

# context init
org.springframework.context.ApplicationContextInitializer=\
my.package.MyConfiguration

当我尝试在类路径上运行带有此启动器的应用程序时,我在启动时看到异常,表明没有刷新范围 .

java.lang.IllegalStateException: No Scope registered for scope name 'refresh'

我的猜测是这一定是订购问题 . 我的bean创建时的意思是,还没有创建 RefreshScope bean? org.springframework.cloud.autoconfigure.RefreshAutoConfiguration 是声明 RefreshScope bean的内容 .

是否有一个好的或建议的方法来功能性地注册需要在_1369497中的spring bean?