Java / Spring:使用XML“标记” Bean以按类和标记获取特定的Bean

use*_*142 3 java spring

我有几个文件组成的大型XML配置。

我需要让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 
}
Run Code Online (Sandbox Code Playgroud)

春天有没有类似的东西?

我发现2解决方法。首先是使用特殊标签ID:

第一

<bean class="myInterfaceImpl1" id="MyInterface-beanForMe" />
Run Code Online (Sandbox Code Playgroud)

但是,当我在IDE中重命名类时,除非我编写IDE插件来支持我的想法,否则一切都会失败。

第二种是将所有“标记”的bean添加到特定列表中,通过id获得它,然后遍历它以找到合适的bean。

但是标签将是最好的选择。你怎么看?

axt*_*avt 5

Spring 恰好有一个用于此目的的限定词

<bean class="myInterfaceImpl1">
    <qualifier value = "beanForMe" />
</bean> 
Run Code Online (Sandbox Code Playgroud)

不幸的是,它们仅打算用于自动装配,但是您可以手动访问它们,尽管这很丑陋:

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);
Run Code Online (Sandbox Code Playgroud)