2016-08-05 292 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應用程序上下文中出現的第二個故障?我有同樣的問題。 –

相關問題