有没有办法防止bean覆盖Spring Boot?

时间:2016-08-05 17:04:26

标签: java spring spring-boot

使用Spring的AbstractRefreshableApplicationContext,如果Bean ID或循环引用中存在冲突,我可以通过设置几个标志并刷新上下文来强制Spring失败:

AbstractRefreshableApplicationContext refreshableContext;
...
refreshableContext.setAllowBeanDefinitionOverriding(false);
refreshableContext.setAllowCircularReferences(false);
refreshableContext.refresh();

但是,Spring Boot返回ConfigurableApplicationContext,它不是AbstractRefreshableApplicationContext的实例,并且似乎没有任何方法可以阻止bean定义覆盖或循环引用。

有没有人知道某种方法,并举例说明如何防止这些类型的冲突?

对于上下文,这适用于具有带注释和xml定义bean组合的大型项目。使用的Spring Boot版本是1.3.1.RELEASE。在某些情况下,人们在xml中添加了重复的bean定义,但应用程序启动正常,并且在发生运行时问题之前,原始bean被覆盖并不是很明显。

此处的目标是在发生此类冲突时阻止应用程序启动事件。从各种论坛我知道Spring IDE可以检测到这些,但是希望在CI构建中强制执行这个,这是一个更强大的安全网。

经过一些搜索,我在Sprint Boot返回的上下文中找不到任何支持。如果无法通过上下文完成此操作,是否有不同的解决方案?

提前致谢。

2 个答案:

答案 0 :(得分:8)

构建Spring Boot应用程序时可以使用初始化程序:

@SpringBootApplication
public class SpringBootApp {

    public static void main(String... args) {
        new SpringApplicationBuilder(SpringBootApp.class)
            .initializers(new ApplicationContextInitializer<GenericApplicationContext>() {
                @Override
                public void initialize(GenericApplicationContext applicationContext) {
                    applicationContext.setAllowBeanDefinitionOverriding(false);
                }
            })
        .run(args);

    }
}

或者使用java 8:

new SpringApplicationBuilder(SpringBootApp.class)
    .initializers((GenericApplicationContext c) -> c.setAllowBeanDefinitionOverriding(false) )
    .run(args);

答案 1 :(得分:3)

将以下内容添加到您的application.yml

spring.main.allow-bean-definition-overriding: false