如何在bean存在时注入它
我有弹簧上下文文件的以下结构( ->
代表’includes’):
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但是
刚给了我一个名字的NoSuchBeanDefinitionException
,它似乎是b.toString()
的值!
顺便说一句:我已经知道这件东西太乱了,应该尽快清理干净。
SpEL表达式的#root对象是BeanExpressionContext,您可以在该上下文中调用getObject()
方法; 如果没有声明bean,它返回null …
注意:您使用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; } }
我完全同意清理你的XML 🙂
如果你正在使用基于注释的注入,你可能会尝试这个技巧
@Autowired( required=false )
我不确定这是否适用于您的情况,但值得一试。