当前位置: 首页 > 面试题库 >

如何仅在存在时注入bean

东郭腾
2023-03-14
问题内容

我具有Spring上下文文件的以下结构(->代表“ includes”):

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

C.xml 定义一个bean c

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

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

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

我看着Spring EL但

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

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

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


问题答案:

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

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

注意:之所以使用valuenot,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;
    }
}


 类似资料:
  • 问题内容: 我将Require.js与Angular.js结合使用。 一些控制器需要巨大的外部依赖关系,而其他控制器则不需要,例如,需要Angular UI Codemirror 。这至少是135 kb,至少: 我不想每次我的页面加载时都只包含指令和Codemirror lib只是为了使Angular开心。 这就是为什么我现在仅在遇到路线时才加载控制器,就像这里所做的那样。 但是,当我需要类似的东

  • 我有一个具有以下模式的用户集合: 用户将查找用户。名称,必须是唯一的。添加新用户时,我首先执行搜索,如果没有找到这样的用户,我会将新用户文档添加到集合中。搜索用户和添加新用户(如果未找到)的操作不是原子操作,因此,当多个应用程序服务器连接到DB服务器时,可能会同时收到两个具有相同用户名的添加用户请求,从而导致两个添加用户请求都找不到这样的用户,这反过来会导致两个文档具有相同的“user.name”

  • 我正在用Symfony制作简单的应用程序。我在这里配置了服务 我的服务使用存储库(例如,评论服务使用评论存储库),这里是的构造函数 性质 构造函数: 当我试图运行我的应用程序我得到这个错误 PHP致命错误:未捕获Symfony\Component\DependencyInjection\Exception\AutowiringFailedException:无法自动连线服务“AppBundle\R

  • 我有一个使用Spring Batch编写的批处理作业 我在下面有一个配置文件: 我有Json线聚合如下: 我想注入对象映射器,不想在JsonLineAggregator类中创建它。我知道如何使用DI实现它吗?

  • 我们遇到了遗留代码的问题。对于“username”字段有一个验证集,验证其长度并确保至少包含一个字母: 我们面临的问题是,一些现有的遗留数据不适合这些验证,我试图找到一种方法,使这些验证对遗留数据(老用户)被忽略,而仍然适用于新创建的用户。 我正在考虑将验证移到方法(因此仅在实际更改时验证值),但这导致了一个异常:

  • 问题内容: 我需要将两个对象注入。其中一个是的实例,我得到这样的信息: 那么如何在我的services.yml中声明呢?这是服务: 问题答案: 我找到了此链接,这对我有用: