Spring:将@Qualifier与Property Placeholder一起使用

时间:2013-08-13 12:34:34

标签: spring

我正在尝试使用属性占位符作为@Qualifier的属性,如下所示:

@Autowired
@Qualifier("${beanName}")
private MyBean myBean;

但是,这不起作用,即使属性占位符可用作String值:

@Value("${beanName}")
private String beanName;

这里有什么好的解决方法,非常感谢。

3 个答案:

答案 0 :(得分:11)

我遇到了完全相同的问题。只需使用Resource

即可
@Resource(name="${beanName}")
private MyBean myBean;

答案 1 :(得分:1)

我不能发表评论所以这是我的回答:

正如亚当B所说,也许你可以使用弹簧轮廓来达到你所瞄准的结果(你的目标是什么?)。

你可以做的另一件事是:

在xml上下文配置中配置映射(使用spring util命名空间),如下所示:

 <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> 

然后你可以在一个名为eg的bean中加载这个地图。 “com.xxx.BeanSelector”

@Value("#{mapId}")
private Map<String, com.xxx.interface-or-superclass> myMap;

并向这个bean添加一个像这样的方法:

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;

然后你可以实现myBean(如果你正在实现接口InitializingBean,可能在方法afterPropertiesSet()内)

以这种方式:

myBean = beanSelector.getBean(beanName);
// then check ifthe bean is not null or something like that

好吧,它有点混乱,也许你可以根据你想要达到的目标以不同的方式行事,但这是一种解决方法。

答案 2 :(得分:0)

试一试(不知道要解决的问题)。您可以像往常一样使用固定bean名称(不支持带占位符的autowire),但您可以根据属性值从不同的xml加载不同的bean实现。
   。 否则考虑基于bean别名的解决方案。 我的2美分