如何在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 ) 

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