【问题标题】:How to inject a bean only when it exists如何仅在 bean 存在时才注入 bean
【发布时间】:2012-10-26 09:25:11
【问题描述】:

我有以下弹簧上下文文件结构(-> 代表“包含”):

A1.xml -> B.xml & C.xml
A2.xml -> B.xml

C.xml 定义了一个 bean c

B.xml 定义了一个依赖于c 的bean b

显然这对于​​ A2 失败,因为在上下文 A2 中没有定义 c

我如何指定如下内容:如果上下文中有c,则将其注入b,否则只需注入null

我研究了 Spring EL,但是

<property name="b" ref="#{ @c?:null}" />

刚刚给了我一个NoSuchBeanDefinitionException 的名称,它似乎是b.toString() 的值!?

顺便说一句:我已经知道这东西乱七八糟,应该尽快清理干净。

【问题讨论】:

    标签: java spring optional spring-el


    【解决方案1】:

    SpEL 表达式的#root 对象是一个 BeanExpressionContext,您可以在该上下文上调用getObject() 方法;如果未声明 bean,则返回 null...

    <property name="bar" value="#{getObject('bar')}" />
    

    注意:您使用 value 而不是 ref,因为它返回的是 bean,而不是 bean 定义。

    这是来自getObject()的代码

    public Object getObject(String key) {
        if (this.beanFactory.containsBean(key)) {
            return this.beanFactory.getBean(key);
        }
        else if (this.scope != null){
            return this.scope.resolveContextualObject(key);
        }
        else {
            return null;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我非常同意清理你的 XML :-)

      如果你使用基于注解的注入,你可以试试this trick

      @Autowired( required=false )
      

      我不确定这是否适用于您的情况,但值得一试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 2019-08-04
        • 2013-02-26
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多