2011-12-01 87 views
3

我有幾個文件構成的大XML配置。Java/Spring:用XML標記「bean」以通過類和標記獲取特定的bean

我需要讓bean實現特定的接口。但有幾個實現,所以我必須選擇。我想有特殊的「標籤」來標記bean來得到它容易:

<bean class="myInterfaceImpl1" tag="beanForMe" /> 
<bean class="myInterfaceImpl2" /> 
<bean class="myInterfaceImpl3" /> 

T get(Class<T> clazz) { 
    return factory.getBean(clazz, "beanForMe"); //Returns first one 
} 

是否有類似的東西在春天?

我找到了2個解決方法。首先是使用特殊的標籤ID:

第一

<bean class="myInterfaceImpl1" id="MyInterface-beanForMe" /> 

但是,當我在我的IDE一切重命名類,除非我寫的IDE插件來支持我的想法會失敗。

第二個是將所有「標記」bean添加到特定列表中,通過id獲取它,然後遍歷它以找到合適的bean。

但標籤將是最好的在這裏。你怎麼看?

+1

標籤有什麼意義?它如何比指定一個ID或名稱更好? –

+0

Java代碼接受類名作爲參數,並應找到合適的bean。在這種情況下,id必須是類名的派生。看到我的「第一個」想法,爲什麼我不喜歡它 – user996142

+0

這似乎是一種倒退,似乎你已經提供了一個不必要的抽象層到一個框架,但你的用例不清楚 - 我很可能錯過了一些東西。 –

回答

4

彈簧具有qualifiers一個概念正是出於這個目的:

<bean class="myInterfaceImpl1"> 
    <qualifier value = "beanForMe" /> 
</bean> 

不幸的是,它們僅用於自動裝配使用,但您可以手動訪問他們,雖然這將是非常難看:

ConfigurableListableBeanFactory cbf = ((ConfigurableListableBeanFactory) factory); 
BeanDefinition bd = cbf.getBeanDefinition(name); 
AutowireCandidateQualifier q = ((AbstractBeanDefinition) bd).getQualifier(Qualifier.class.getName()); 
String value = (String) q.getAttribute(AutowireCandidateQualifier.VALUE_KEY); 
+0

謝謝。太糟糕了,他們沒有精簡的界面。我不想在這裏使用autowire。我讓他們支持新的界面:https://jira.springsource.org/browse/SPR-8891讓我們看看SpringSource會做些什麼 – user996142