10

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

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

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

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

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

4

3 回答 3

16

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

@Resource(name="${beanName}")
private MyBean myBean;
于 2015-05-08T19:57:50.887 回答
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

好的,这有点混乱,也许您可​​以根据想要实现的目标以不同的方式采取行动,但这是一种解决方法。

于 2013-08-13T18:41:37.060 回答
0

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

于 2013-08-13T19:26:51.487 回答