2016-08-05 135 views
3

随着春天的AbstractRefreshableApplicationContext,我能力弹簧是否有通过设置几个标志和清爽,像这样的背景下Bean的ID或循环引用冲突失败:有没有一种方法可以防止Spring Boot重载bean?

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

然而,春天启动的回报一个ConfigurableApplicationContext它不是AbstractRefreshableApplicationContext的一个实例,并且似乎没有任何方法来阻止bean定义覆盖或循环引用。

有谁知道一种方式,并有一个如何防止这些类型的冲突的例子?

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

这里的目标是防止应用程序在发生这种冲突时启动事件。从各种论坛我都知道Spring IDE可以检测到这些,但是我们的愿望是在CI构建中实施这个强大的安全网。

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

在此先感谢。

+0

@Primary是你的朋友。和/ @资源...主要和资源-_- – Sarief

+0

感谢您的建议,但我不认为这将跨越应用程序上下文工作,无论该bean来自xml vs java。我会在Javadocs上阅读这些信息,以便我回到办公桌时看到。 – Hazok

+0

它会通过ID来捕获bean,无论它来自哪里。小学也是第一。 – Sarief

回答

4

构建春天启动的应用程序时,您可以使用一个初始化:

@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); 
+0

这个实现看起来像是我正在寻找的东西。尝试一下,如果一切都很好,这将是投票的公认答案。 – Hazok

+0

该解决方案能够正常工作,并且我能够在我的Spring Boot应用程序中成功解决定义冲突。感谢你的回答。 另一方面,现在看起来我现在失败了来自Spring Boot嵌入式Web应用程序上下文,现在禁用了bean定义覆盖。我现在要深入探讨这个新问题,并且在不久的将来可能会有新的问题要问这个新问题。 – Hazok

+0

您是否发现了Spring Boot嵌入式Web应用程序上下文中出现的第二个故障?我有同样的问题。 –

相关问题