一尘不染

有没有一种方法可以防止Spring Boot覆盖bean?

spring-boot

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

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

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

有谁知道一种方法并举例说明如何防止这些类型的冲突?

对于上下文,这是针对一个大型项目,该项目混合了带注释的xml和xml定义的bean。使用的Spring
Boot的版本是1.3.1.RELEASE。在某些情况下,人们在xml中添加了重复的bean定义,但是应用程序启动正常,直到开始出现运行时问题,才立即覆盖原始bean。

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

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

提前致谢。


阅读 613

收藏
2020-05-30

共1个答案

一尘不染

您可以在构建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);
2020-05-30