如何从第三方为@Inject设置非CDI bean到CDI bean

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

但是,有些情况下CDI根本无法创建实例.

例如第三方库(不使用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,或者设置@Produces for ByteBuffer,甚至让Foo自己制作ByteBuffer. (所有这些都会更容易).我之所以选择ByteBuffer,是因为它表现出与第三方库相同的问题

>实例是有效的bean
>我无法控制其来源
>实例由库创建
>这些实例是最终的,无法包装,覆盖或代理

该用例还具有嵌套CDI引用的情况,该引用也可以使用对此@Inject ByteBuffer buf的访问权限.

理想情况下,它希望这是一种纯粹的CDI api技术,而不是焊接或实现特定的东西.

我也开始使用自定义Scope创建,认为这可能是一个解决方案,有一种@BufferScope可以识别此实例的start()和end().但是,对于CDI无法调用newInstance()或produce()的对象,没有一个示例和文档能够清楚地表明这一点.对象实例化不在我的手中,但是可以将它呈现给CDI Scope,甚至可以管理该实例的最终死亡/破坏.

最佳答案 代理与包装不同.一种常见的解决方法是创建一个ByteBufferHolder(在此处插入您的类),使自定义构建器流适应一个理解它在DI上下文中的bean.

点赞