[英]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();
}
在這種情況下,我希望在啟動過程中通過類路徑掃描同時發現Plugin
和CoreClass
,但隨后應該忽略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.