我有弹簧上下文文件的以下结构(->
代表'includes'):
A1.xml -> B.xml & C.xml
A2.xml -> B.xml
C.xml
定义了一个bean c
B.xml
定义了一个依赖于b
c
显然,A2失败了,因为上下文c
中没有定义A2
。
如何指定类似内容:如果您在上下文中c
注入b
,则只需注入null
?
我看了一下Spring EL但是
<property name="b" ref="#{ @c?:null}" />
刚给了我NoSuchBeanDefinitionException
这个名字似乎是b.toString()
的价值!?
答案 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)