【问题标题】:Spring: Using @Qualifier with Property PlaceholderSpring:将@Qualifier 与属性占位符一起使用
【发布时间】:2013-08-13 12:34:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 一个好的解决方法取决于您的总体目标。那么你想解决什么普遍的问题呢?
  • 我正在使用 Spring 3 ProprtySource 在加载时将 bean 的名称传递给上下文。这是关键:bean 名称必须作为参数传递到应用程序上下文中。该参数被 @Value 注释识别,但不被 Qualifier 识别。
  • 但是为什么呢?可能有更适合您的目标的替代方案。如果我不得不盲目猜测,听起来 Spring 3.1 的 bean 配置文件可能适合您的目标。
  • 我需要传递给应用程序上下文的 bean 名称直到加载 spring 上下文时才能知道,因为它是从另一个应用程序中检索的。所以我需要以某种方式传递该字符串,并在 @Qualifier 中使用它 - 或以另一种方式实现相同的目标。

标签: spring


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    然后你可以在一个名为 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
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 2011-09-22
        • 2014-03-26
        • 1970-01-01
        相关资源
        最近更新 更多