Spring:使用@Qualifier与属性占位符

11

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

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

然而,即使属性占位符作为字符串值可用,这也不起作用:

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

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


一个好的解决方法取决于你的总体目标。所以,你想要解决什么一般性的问题? - Ralph
我正在使用Spring 3 ProprtySource将bean的名称传递到上下文中,当加载时。这是关键:bean名称必须作为参数传递到应用程序上下文中。该参数由@Value注释识别,但不被Qualifier识别。 - user1052610
3
为什么呢?可能有更适合您目标的替代方案。如果我不得不猜测,听起来像是Spring 3.1的bean配置文件能够满足您的需求。 - Adam B
我需要传递到应用上下文中的bean名称在Spring上下文加载之前是无法确定的,因为它是从另一个应用程序检索的。所以我需要想办法把字符串传进去,并在@ Qualifier中使用它 - 或以其他方式实现相同的功能。 - user1052610
3个回答

17
我遇到了完全相同的问题。只需使用Resource即可。
@Resource(name="${beanName}")
private MyBean myBean;

1

我无法留言,所以这是我的回答:

正如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;

并向这个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;

那么你可以实例化我的Bean(如果你正在实现InitializingBean接口,可能在方法afterPropertiesSet()中进行)

这样做:

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

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接