gpt4 book ai didi

java - 如何从第 3 方为 @Inject 设置非 CDI bean 到 CDI bean

转载 作者:搜寻专家 更新时间:2023-11-01 03:21:51 25 4
gpt4 key购买 nike

虽然我在 CDI 中找到了设置 @Produces(有点像工厂)或使用 CDI javax.enterprise.inject.spi.Unmanaged 概念的示例,他们似乎都假定 CDI 将是根据自己的条款和生命周期(这是有道理的)创建类实例的人。

但是,在某些情况下,CDI 根本无法创建实例。

例如第 3 方库(不使用 CDI 本身)在内部创建对象并将其提供给您。

现在,我如何获取这些已经实例化的对象(顺便说一句,它们是没有默认构造函数的最终对象),然后让我的 CDI 托管 bean 可以使用它们?

这是一个简化的例子。

public class Foo
{
@Inject
private ByteBuffer buf;

public void go()
{
// do something, with buffer
}
}

public void process() {
ByteBuffer buf = ByteBuffer.allocate(500);
// TODO: how to add "buf" to current context?
Foo foo = CDI.current().select(Foo.class,AnyLiteral.INSTANCE).get();
foo.go();
}

现在,我意识到对于这个特定示例,我可以很容易地传入 ByteBuffer,或者为 ByteBuffer 设置一个 @Produces,或者甚至让 Foo 生成字节缓冲区本身。 (所有这些都会更容易)。我选择了 ByteBuffer,因为它展示了我在第 3 方库中面临的相同问题

  • 实例是有效的bean
  • 我无法控制它的来源
  • 实例由图书馆创建
  • 这些实例是final,不能被包装、覆盖或代理

用例还有嵌套的 CDI 引用也可以访问此 @Inject ByteBuffer buf; 的情况。

理想情况下,希望这是一种纯 CDI api 技术,而不是特定于 Weld 或实现的技术。

我也研究了自定义作用域的创建,认为这可能是一个解决方案,有一种 @BufferScope 标识 start() 和此实例的 end()。但是,对于 CDI 无法对其调用 newInstance()produce() 的对象,没有一个示例和文档能够非常清楚地说明这一点。对象实例化不在我手中,但可以将它呈现给 CDI 范围,甚至可以管理该实例的最终死亡/销毁。

最佳答案

代理与包装不同。通常的解决方法是创建一个 ByteBufferHolder(在此处插入您的类),将自定义构建器流调整为一个了解它位于 DI 上下文中的 bean。

关于java - 如何从第 3 方为 @Inject 设置非 CDI bean 到 CDI bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443989/

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