Итак, я написал расширение, которое регистрирует бин, который я пытаюсь создать.Бин сканируется CDI, и я могу получить его, используя:
MyInterface myInterface = CDI.current().select(MyInterface.class).get();
И тогда я могу получить доступ к myInterface.myMethod();
Однако, когда я пытаюсь ввести свой бин, используя:
@Inject
@MyBean
MyInterface myInterface;
он не внедрен и имеет значение null .
Чего я хочу добиться, так это указать интерфейс, который определяет некоторые методы, затем мой код генерирует экземпляр этого интерфейсаи возвращает прокси типа интерфейса:
// 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 Iпоставить ссылку на MyExtension