如何在bean存在时注入它

时间:2012-10-26 09:25:11

标签: java spring optional spring-el

我有弹簧上下文文件的以下结构(->代表'includes'):

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

C.xml定义了一个bean c

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

的bean c

显然,A2失败了,因为上下文c中没有定义A2

如何指定类似内容:如果您在上下文中c注入b,则只需注入null

我看了一下Spring EL但是

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

刚给了我NoSuchBeanDefinitionException这个名字似乎是b.toString()的价值!?

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

2 个答案:

答案 0 :(得分:18)

SpEL Expression的#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;
    }
}

答案 1 :(得分:8)

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

如果您使用基于注释的注入,则可以尝试this trick

@Autowired( required=false )

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