【发布时间】:2015-04-11 05:05:52
【问题描述】:
虽然我在 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。 (所有这些都会更容易)。我选择了 ByteBuffer,因为它表现出我在使用 3rd 方库时遇到的相同问题
- 实例是有效的 bean
- 我无法控制其来源
- 实例由库创建
- 这些实例是
final,不能被包装、覆盖或代理
该用例还存在嵌套 CDI 引用的情况,这些引用也可以使用对此@Inject ByteBuffer buf; 的访问。
理想情况下,希望这是一种纯粹的 CDI api 技术,而不是特定于焊接或实现的东西。
我也开发了自定义范围创建,认为这可能是一个解决方案,有一种@BufferScope 来标识此实例的start() 和end()。但是对于 CDI 不能调用 newInstance() 或 produce() 的对象,没有一个示例和文档可以非常清楚地说明这一点。对象实例化不在我的掌控之中,但将其呈现给 CDI Scope 的能力是可能的,甚至可以管理该实例的最终死亡/销毁。
【问题讨论】:
-
抱歉,我不明白
@Produces的限制是什么让你需要这个。