我正在尝试将属性占位符用作@Qualifier的属性,如下所示:
@Autowired
@Qualifier("${beanName}")
private MyBean myBean;
然而,即使属性占位符作为字符串值可用,这也不起作用:
@Value("${beanName}")
private String beanName;
这里有什么好的解决方法吗?非常感谢。
我正在尝试将属性占位符用作@Qualifier的属性,如下所示:
@Autowired
@Qualifier("${beanName}")
private MyBean myBean;
然而,即使属性占位符作为字符串值可用,这也不起作用:
@Value("${beanName}")
private String beanName;
这里有什么好的解决方法吗?非常感谢。
我无法留言,所以这是我的回答:
正如Adam B所说,也许您可以使用Spring配置文件来实现您的目标(您的目标是什么?)。
另外一件事情是:
在您的XML上下文配置中,使用Spring Util命名空间配置一个映射(map),就像这样:
<util:map id="mapId" key-type="java.lang.String" value-type="com.xxx.interface-or-superclass">
<beans:entry key="${property.bean.name.1}" value-ref="bean1-defined-elsewehere"/>
<beans:entry key="${property.bean.name.2}" value-ref="bean2-defined-elsewehere"/>
<beans:entry key="${property.bean.name.3}" value-ref="bean3-defined-elsewehere"/>
</util:map>
然后你可以在一个名为"com.xxx.BeanSelector"的bean中加载这个地图。
@Value("#{mapId}")
private Map<String, com.xxx.interface-or-superclass> myMap;
public interface-or-superclass getBean(String beanName){
return myMap.get(beanName);
}
现在你可以拥有一个类似于这样的最终类:
@Autowired
private BeanSelector beanSelector;
@Value("${property.name.the.bean.you.want.to.use}")
private String beanName;
private interface-or-superclass myBean;
那么你可以实例化我的Bean(如果你正在实现InitializingBean接口,可能在方法afterPropertiesSet()中进行)
这样做:
myBean = beanSelector.getBean(beanName);
// then check ifthe bean is not null or something like that
好的,这可能有点混乱,也许你可以根据想要实现的目标以不同的方式行动,但这是一个解决方法。
只是试一试(不知道要解决的问题)。您可以像往常一样使用固定的bean名称(不支持占位符自动装配),但可以根据属性值从不同的基于XML的文件加载不同的bean实现。
否则,请考虑基于bean别名的解决方案。
我的建议