8

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

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

C.xml定义一个 beanc

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

c显然这对 A2 失败,因为在 context中没有定义A2

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

我调查了 Spring EL,但是

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

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

Btw:我已经知道这东西乱七八糟,应该尽快清理干净。

4

2 回答 2

22

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

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

注意:您使用valuenotref因为它返回 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;
    }
}
于 2012-10-26T17:37:05.297 回答
9

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

如果你使用基于注解的注入,你可以试试这个技巧

@Autowired( required=false )

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

于 2012-10-26T09:59:18.720 回答