所以,我编写了一个扩展程序来注册我想要创建的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
答案 0 :(得分:0)
问题出在bean创建生命周期中-我试图在processAnnotatedType周期中创建bean,而我应该在afterBeanDiscovery周期中做到这一点。
将我的bean创建逻辑移动到适当的周期后,就可以创建bean并正确注入它。