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

use*_*610 8 spring

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

@Autowired
@Qualifier("${beanName}")
private MyBean myBean;
Run Code Online (Sandbox Code Playgroud)

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

@Value("${beanName}")
private String beanName;
Run Code Online (Sandbox Code Playgroud)

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

小智 11

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

@Resource(name="${beanName}")
private MyBean myBean;
Run Code Online (Sandbox Code Playgroud)


Ema*_*ldi 1

我无法发表评论,所以这是我的答案:

正如 Adam 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> 
Run Code Online (Sandbox Code Playgroud)

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

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

并向该 bean 添加如下方法:

public interface-or-superclass getBean(String beanName){
    return myMap.get(beanName);
}
Run Code Online (Sandbox Code Playgroud)

好的,现在你可以有类似于这样的最后一堂课:

@Autowired
private BeanSelector beanSelector;

@Value("${property.name.the.bean.you.want.to.use}")
private String beanName;

private interface-or-superclass myBean;
Run Code Online (Sandbox Code Playgroud)

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

这样:

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

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