gpt4 book ai didi

java - 如何告诉 CDI 容器 "activate"一个 bean?

转载 作者:行者123 更新时间:2023-11-30 02:24:26 25 4
gpt4 key购买 nike

假设我有一些关于注入(inject)的类(class):

class MyBean {

@Inject
Helper helper;

// all sorts of data
}

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

有没有办法告诉 CDI“激活”bean 或至少它的注入(inject)?例如,就好像它是用 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 解析注入(inject)点。这是很不寻常的,因为您处理生命周期的一部分(创建/销毁),同时要求 CDI 完成其余的工作。

在您的情况下,MyBean 类需要变为 InjectionTarget ,这就是您应该开始寻找的方式。为了触发注入(inject),您需要执行以下操作(在创建 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。然而,为此,您的问题没有提供足够的信息。

关于java - 如何告诉 CDI 容器 "activate"一个 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46026384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com