我如何告诉 CDI 容器“激活”bean?

2023-12-12

假设我有一些带有注射的课程:

class MyBean {

    @Inject
    Helper helper;

    // all sorts of data
}

并且这个类是以 CDI 容器不知道的方式创建的,例如反射、序列化或new。在这种情况下helper is null因为CDI没有为我们初始化它。

有没有办法告诉 CDI“激活”bean 或至少它的注入?例如,就好像它是用Instance<MyBean>#get?

现在我有一个 hack,我可以执行以下操作:

class SomeClass {

    @Inject
    Instance<MyBean> beanCreator;

    void activateBean() {
        MyBean mybean = ... // reflection/serialization/new
        MyBean realBean = beanCreator.get();
        Helper proxy = realBean.getHelper();
        mybean.setHelper(proxy);
        beanCreator.destroy(realBean);
    }
}

这看起来很糟糕,但它适用于我测试的所有内容。它只是显示了我想要的最终结果。

如果有必要,请使用 Wildfly 10.1。


首先,你的使用方式MyBean不是CDI方式;事实上,您对所谓的非上下文对象进行操作。您正在做的是获取非 CDI 托管对象并要求 CDI 解析注入点。这是很不寻常的,因为您处理生命周期的一部分(创建/销毁),同时要求 CDI 完成其余的工作。

就你而言,MyBean类需要成为InjectionTarget,这就是您应该开始寻找的方式。为了触发注入,您将需要执行类似的操作(在创建期间MyBean):

// Create an injection target from your given class
InjectionTarget<MyBean> it = beanManager.getInjectionTargetFactory(beanManager.createAnnotatedType(MyBean.class))
                .createInjectionTarget(null);
CreationalContext<MyBean> ctx = beanManager.createCreationalContext(null);
MyBean instance = new MyBean();
it.postConstruct(instance); // invoke @PostContruct
it.inject(instance, ctx); // trigger actual injection on the instance

请注意,这种方法通常很笨拙(因为很难使其工作和维护),最好将您的MyBean成真正的 CDI bean 并将整个生命周期管理留给 CDI。然而,为此,您的问题没有提供足够的信息。

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

我如何告诉 CDI 容器“激活”bean? 的相关文章

随机推荐

  • 如何获取struts标签中的JSP scriptlet值

    这是我的代码 如果我执行以下操作 我将不会获得该值
  • 管道“cd”或“popd”输出会阻止更改目录吗?

    我明白 自从 为命令启动一个新进程after管道 任何形式的 shell 命令cmd cd newdir where cmd不更改当前工作目录 将保持原始进程的工作目录不变 更不用说这有点愚蠢了 因为cd不从 stdin 读取输入 但是 在
  • Google Apps 脚本按钮:我可以分配未附加到工作表的“全局”脚本吗?

    我有一个脚本 想将其分配给多个不同电子表格上的按钮 如果我在电子表格上创建一个按钮并引用存储在 Google 驱动器上另一个父文件夹中的脚本 我会收到错误Script function myScript could not be found
  • @autoreleasepool 没有 ARC?

    我是 Xcode 4 2 的新手 还没有完全熟悉 ARC 然而 我确实读到 autoreleasepool 取代了自动释放池的手动使用 并在幕后做了一些特殊的魔法来与 ARC 很好地配合 然而 当我在 Xcode 4 2 中启动一个新项目时
  • 同步动态加载 JavaScript

    我正在使用模块模式 我想做的一件事是动态包含一个外部 JavaScript 文件 执行该文件 然后在return 我的模块 我不知道如何轻松做到这一点 是否有执行伪同步外部脚本加载的标准方法 function myModule var ta
  • 奥利奥:广播接收器不工作

    每当用户拨打新电话时 我试图在我的应用程序上获取通知触发器 我正在我的活动中注册接收器并在 onDestroy 方法中销毁它 以下是注册的代码片段 registerReceiver inComingCall new IncomingCall
  • 在 JavaScript 中序列化/反序列化对象的最佳方法?

    我的应用程序中有许多 JavaScript 对象 例如 function Person age this age age this isOld function return this age gt 60 before serialize
  • 获取 API post XML 请求错误

    我没能做到fetch发布请求 它返回一个400 bad request error fetch http 192 168 1 6 49152 ctl RenderingControl method POST headers SOAPActi
  • 箭头函数比 v8 中的普通独立函数声明更快(性能更高、更轻)吗?

    我问这个问题是因为我和我的同事在编码风格上存在争议 因为他更喜欢箭头函数声明 const sum a b gt a b 我更喜欢旧式的独立函数声明 function sum a b return a b 我的观点是 旧式代码更具可读性 您可
  • 下载进度状态,从 Google 云端硬盘下载文件时?

    我可以从 Google 云端硬盘下载文件 但我想知道下载进度 谁能告诉我该怎么做 我已经尝试过这样下载文件 NSString downloadURL self driveFiles objectAtIndex indexPath row d
  • 源文件与构建模块时不同

    这真让我抓狂 我有一个相当大的项目正在尝试修改 我早些时候注意到当我输入时DbCommand Visual Studio没有对其进行任何语法高亮 我正在使用usingSystem Data Common 尽管没有突出显示任何内容 该项目似乎
  • 如何使用 Inno Setup 创建一个安装程序来提取 .rar 存档的内容?

    我想在 Inno Setup 中创建一个安装程序 它提取预先创建的内容Data rar档案 我的意思是它应该将 rar 存档的内容视为应用程序的文件和文件夹 通过 Inno Setup 使用外部提取实用程序的通用方法 创建档案 将存档嵌入到
  • Material-UI LinearProgress 栏不起作用

    我有一个简单的文件上传实用程序 我正在使用它反应 dropzone 并结合我想使用material ui LinearProgress bar来显示进度 下面显示的是我创建的组件 它呈现文件上传实用程序以及 LinearProgress 栏
  • 在 React 项目上运行 NPM start 后出错

    我已将项目从以前的计算机复制到当前的计算机 跑步后npm install And npm start我的终端给出了这个错误 sh 反应脚本 找不到命令npm 错误 文件shnpm 错误 代码 生命周期npm 错误 错误信息npm 错误 系统
  • Java 1.7 重写 hashCode() 的行为不符合我的预期

    我有一个类 我重写了 hashCode 方法和 equals 方法 equals 方法的行为符合我的预期 但是 hashCode 方法的行为似乎并不符合我的预期 我假设我的期望是不正确的 但不确定为什么 以下是重写的方法 public cl
  • .not() 和 .live() 不起作用

    jQuery a not div mnuMain a live click function event event preventDefault alert yes I got u 如何让它发挥作用 尝试将其全部放入主选择器中 Examp
  • 在 Hibernate 中指定“唯一的”限制

    我有一个实体 我想在其中指定两个字段应具有唯一对值的限制 例如 一个字段是所有者 另一个字段是名称 我想要一个限制 即 所有者 名称 的组合应该是唯一的 但我不想将它们设为复合主键 Entity Table name keyfile pub
  • Meteor:资源解释为图像,但以 MIME 类型 text/html 传输

    我正在使用 Meteor 0 5 2 并且在 Chrome 中针对每个由模板助手生成 src 的图像收到以下警告 Resource interpreted as Image but transferred with MIME type te
  • JavaScript async/await for Promises inside Array.map() [重复]

    这个问题在这里已经有答案了 给出以下代码 class SomeClass async someFunc const urlParameters 0 1 2 const batchAjaxResult await urlParameters
  • 我如何告诉 CDI 容器“激活”bean?

    假设我有一些带有注射的课程 class MyBean Inject Helper helper all sorts of data 并且这个类是以 CDI 容器不知道的方式创建的 例如反射 序列化或new 在这种情况下helper is n