簡體   English   中英

我可以覆蓋使用類路徑掃描定義的Spring bean定義嗎?

[英]Can I override a spring bean definition defined using classpath scan?

我有一個應用程序,它具有非常簡單的插件體系結構,可以通過使用Spring類路徑掃描來注冊其他行為(通過將plugin.jar放在類路徑上來“安裝”插件)。

這非常適合注冊其他bean,也非常適合注冊如下的鈎子:

// core.jar:
@Component
class CoreClass {
  public void addListener(Listener listener) { /* ... */ }
}

// plugin.jar
@Component
class Plugin {
  public Plugin(CoreClass coreClass) {
    coreClass.addListener(new PluginListener());
  }
}

但是有時替換整個bean更合適。 可能看起來像這樣:

// core.jar:
@Component("someBean")
class CoreClass implements CoreInterface {
  @Override
  public void doStuff();
}

// plugin.jar
@Component("someBean")
@Order(HIGHEST_PRECEDENCE)
class Plugin implements CoreInterface {
  @Override
  public void doStuff();
}

在這種情況下,我希望在啟動過程中通過類路徑掃描同時發現PluginCoreClass ,但隨后應該忽略CoreClass ,因為bean someBean具有另一個具有更高優先級的定義。

我知道我可以使用XML( <import resource="classpath*:plugin-spring.xml" /> )來完成此操作,因為XML允許覆蓋定義。 但這也可以使用注釋嗎?

編輯:請注意,有時我會注入基於名稱的相同類型(具有不同屬性)的多個bean實例。 因此,我實際上需要使用特定名稱覆蓋bean。

可能使用的解決方案:

@主

指示當多個候選者有資格自動裝配單值依賴項時,應優先考慮Bean。 如果候選對象中僅存在一個“主” bean,它將是自動裝配的值。

該注釋在語義上等效於Spring XML中元素的主要屬性。

可以用於直接或間接用@Component注釋的任何類,或用@Bean注釋的方法。

// core.jar:
@Component
class CoreClass implements CoreInterface {
  @Override
  public void doStuff();
}

// plugin.jar
@Component
@Primary
class Plugin implements CoreInterface {
  @Override
  public void doStuff();
}

http://memorynotfound.com/handling-multiple-autowire-candidates-with-spring-primary/

或者您可以使用:

@Configuration  
@ImportResource( { "classpath*:core-spring.xml", "classpath*:plugin-spring.xml" } )  
public class ConfigClass { } 

我懷疑注解的問題不清楚要覆蓋哪個順序,如果您在注解中定義了相同的名稱,則最終將出現ConflictingBeanDefinitionException彈簧,將不允許您使用相同名稱的@Component@Bean 在xml中,您可以管理覆蓋順序,因此可以在xml上進行覆蓋。 在注釋中,您不能這樣做。

任何給定的Spring上下文對於任何給定的id或name只能有一個bean 對於XML id屬性,這是通過模式驗證來強制執行的。 對於name屬性,這是由Spring的邏輯強制執行的。

但是,如果上下文是從兩個不同的XML描述符文件構造的,並且兩個文件都使用了ID,則一個將“覆蓋”另一個。 確切的行為取決於上下文加載文件時文件的順序。

因此,盡管有可能,但不建議這樣做。 它容易出錯且易碎,如果更改一個ID而不更改另一個ID,您將無法從Spring獲得幫助。

但是,如果上下文是從兩個不同的XML描述符文件構造的,並且兩個文件都使用了ID,則一個將“覆蓋”另一個。 確切的行為取決於上下文加載文件時文件的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM