CDI bean 没有注入但是可以查到

CDI bean is not injected but can be looked up

所以,我写了一个扩展来注册我试图创建的 bean。该 bean 被 CDI 扫描,我可以使用:

MyInterface myInterface = CDI.current().select(MyInterface.class).get();

然后我可以访问 myInterface.myMethod();

但是,当我尝试使用以下方法注入我的 bean 时:

@Inject
@MyBean
MyInterface myInterface;

未注入并且为空

我要实现的是我指定接口,它定义了一些方法,然后我的代码生成这个接口的实例和returns接口类型的代理:

// defined interface
@RegisterAsMyBean
interface MyInterface {
    void myMethod();
}

// usage in code:
@Inject
@MyBean
MyInterface myInterface;

我这样声明我的 bean:

public class MyExtension implements Extension {
    public void register(@Observes @WithAnnotations(RegisterAsMyBean.class) ProcessAnnotatedType<?> aType) {
        Class<?> typeDef = aType.getAnnotatedType().getJavaClass();

        if(typeDef.isInterface()) {
            proxyTypes.add(typeDef);
            aType.veto();
        }
    }
}

public class BeanCreator implements Bean<Object> {
    @Override
    public Object create(CreationalContext<Object> creationalContext) {
        // my instance building logic
    }
    // ... other overriden methods
}

也在 META-INF/services/javax.enterprise.inject.spi.Extension 我引用了 MyExtension

问题出在 bean 创建生命周期中 - 我试图在 processAnnotatedType 周期中创建 bean,而我本应该在 afterBeanDiscovery 周期中创建它。

将我的 bean 创建逻辑移动到适当的循环后,bean 被创建并正确注入。