如何仅在 bean 存在时才注入它

2023-11-26

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

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

C.xml定义一个beanc

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

显然这对于​​ A2 来说是失败的,因为没有c在上下文中定义A2.

我怎样才能指定类似的内容:如果你有c在上下文中将其注入b否则只需注入null?

我研究过 Spring EL 但是

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

刚刚给了我一个NoSuchBeanDefinitionException对于一个似乎具有价值的名字b.toString() !?

顺便说一句:我已经知道这东西太乱了,应该尽快清理干净。


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

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

注意:您使用value not 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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅在 bean 存在时才注入它 的相关文章

随机推荐

  • 获取正在运行或挂起的 PHP 脚本的堆栈跟踪

    我有一个每晚从 cron 作业运行的脚本 最近 脚本进入几分钟后就开始完全冻结 我不明白为什么 如果这是 Java 我可以简单地运行kill 3 PID它会在标准输出中打印线程转储 PHP 中是否有任何等效项 我可以在其中获取正在运行的 P
  • Java路径..jvm.cfg错误

    谁能告诉我为什么当我尝试运行 Java 程序时出现以下错误 程序编译成功 但无法运行 我已经设置了Java的路径 C JavaServ gt javac hello1 java C JavaServ gt java hello1 Error
  • mysql 存储过程与 INTO OUTFILE

    我有一个 mysql 存储过程 我想做两件事 1 查询一个表 并将结果作为正常结果集返回 2 迭代结果集并从过程本身创建一个格式化文本文件 我查看了 INTO OUTFILE 但似乎 INTO OUTFILE 将原始结果写入指定的文件 而且
  • 在更改类中的属性时,有没有办法让 didSet 工作?

    我有一个带有属性观察者的类作为属性 如果我更改该类中的某些内容 是否有办法触发 didSet 如示例所示 class Foo var items 1 2 3 4 5 var number Int 0 didSet items number
  • React Native 无限滚动

    我试图获得无限滚动的最小示例 所以我有这个 var React require react native var StyleSheet View Image ListView React var data id 1 profile pict
  • PostgreSql:禁止更新列:如何?

    使用 PostgreSql 可以在没有触发器的情况下不允许更新列 只允许插入 完全未经测试 但由于 Postgres SQL 支持列级权限 看起来可能是这样 http www postgresql org docs current stat
  • N 元组与对

    在 Ocaml 中 具有不同元数的元组具有不同的类型和值构造函数 let a 1 2 3 val a int int int 1 2 3 let b 1 2 3 val b int int int 1 2 3 请注意 第二个示例 b 比第一
  • 配置 ELMAH:无法识别的配置部分错误

    Setup 视窗XP NET框架3 5 SP1 ASP NET MVC 版本 1 我一直在尝试按照以下说明设置 ELMAHhttp code google com p elmah wiki MVC但按 F5 时出现以下错误 Descript
  • SVG 仅在 Safari 中悬停时调整大小

    我有一个奇怪的问题 svg 在 Safari 中悬停时调整大小 我使用 jquery 的悬停来用稍微不同的 svg 替换页面上的 svg 除了 Safari 之外 此功能在所有浏览器中都可以正常工作 由于某种原因 Safari 会在鼠标悬停
  • 更改密码后 KeyStore getEntry 返回 null

    您好 我有一个程序需要在密钥库中存储密钥 我生成一对密钥并签署一个值 这始终可以完美运行 当用户进入首选项并更改密码或将密码模式更改为 pin 模式时 就会出现问题 之后 当我尝试访问私钥时 密钥库返回给我一个空值 我知道密钥存储值是用解锁
  • Julia:添加包的问题 (BinDeps)

    我是 Julia 包管理器的新手 在安装 GLPK 和 LinProgGLPK 时遇到问题 我已经跑了Pkg Init 并已成功安装 Curl 使用Pkg add Curl 但是 当我尝试安装 GLPK 或 LinProgGLPK 使用Pk
  • PHP 的基本身份验证产生无限循环

    由于某种原因 我无法在我的服务器上使用 PHP 进行基本身份验证 我正在使用手册页中的确切代码
  • 如何扩展可用 Java 语言环境列表

    我正在寻找一种方法将更多区域设置添加到 Java 1 6 中可用的区域设置中 但我想要创建的区域设置没有 ISO 3166 国家 地区代码 也没有 ISO 639 语言代码 无论如何 有什么办法可以做到这一点吗 我想添加的区域设置仅在语言名
  • 递归块内的 ARC 行为

    我制作了这两个实用函数 void dispatch void f afterDelay float delay dispatch after dispatch time DISPATCH TIME NOW int64 t delay NSE
  • Appengine - 使用 https 的本地开发服务器

    目标 使用 App Engine 开发服务器缩短开发反馈周期 为了我的使用 它必须作为公共 HTTPS 地址可用 App Engine 开发服务器仅支持 HTTP 这个怎么做 使用 ngrok 将本地开发环境公开为 https 公开可用地址
  • PyLint 错误空白配置

    有没有办法配置检查bad whitespace检查 PyLint 我目前可以禁用检查 但我宁愿强制执行空白约定而不是禁用它 您可以使用两个选项 全局禁用错误空白警告 pylint disable C0326 使用 Pylint 配置文件 p
  • 为什么固定定位会改变元素的宽度?

    我有一个 div 其宽度设置为100 当我添加position fixed到它 宽度变成16px larger 我注意到身体上有8px各边都有边距 所以我猜position fixed以某种方式忽略了包含它的正文标签的边距 我看了看MDN
  • 如何创建具有可变数量参数的函数?

    如何在 Rust 中创建具有可变数量参数的函数 就像这段Java代码 void foo String args for String arg args System out println arg 一般来说 你不能 Rust 不支持可变参数
  • 为什么我们真的需要向下转型? [复制]

    这个问题在这里已经有答案了 我试图弄清楚为什么我需要向下转型 我重新阅读了拼贴画中的笔记 发现了下面的例子 class Student class Graduate exteds Student getResearchTopic this
  • 如何仅在 bean 存在时才注入它

    我有以下 Spring 上下文文件结构 gt 代表 包含 A1 xml gt B xml C xml A2 xml gt B xml C xml定义一个beanc B xml定义一个beanb依赖于c 显然这对于 A2 来说是失败的 因为没