CDI bean没有注入,但可以查找

时间:2018-05-22 13:35:32

标签: java reflection dependency-injection cdi inject

所以,我编写了一个扩展程序来注册我想要创建的bean。这个bean被CDI扫描,我可以使用它来获取它:

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

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

但是,当我尝试使用:

注入我的bean时
@Inject
@MyBean
MyInterface myInterface;

未注入且为空

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

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

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

我宣布我的豆子是这样的:

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

1 个答案:

答案 0 :(得分:0)

问题出在bean创建生命周期中-我试图在processAnnotatedType周期中创建bean,而我应该在afterBeanDiscovery周期中做到这一点。

将我的bean创建逻辑移动到适当的周期后,就可以创建bean并正确注入它。