У меня есть класс, для которого создается сторонний код (он использует отражение для создания объекта). Я предоставляю реализацию их интерфейса, и они создают объект.В моей реализации я хочу использовать CDI для внедрения сервиса, который выполняет логику.Как правильно это сделать?
public interface ThirdPartyInterface {
public void DoSomething();
}
public class InjectedService {
public void DoSomeLogic() { ... }
}
public class MyImplementation implements ThirdPartyInterface {
@Inject InjectedService service;
@Override
public void DoSomething() {
service.DoSomeLogic();
}
}
Я изначально думал, что это сработает благодаря магии CDI, но обнаружил, что мой сервисный объект пуст.
Единственное, что я до сих пор придумал, - это внедрить службу вручную в конструкторе
public MyImplementation() {
CDI<Object> cdi = CDI.current();
service = cdi.select(InjectedService.class).get();
}
Это правильный / единственный / лучший способ получения экземпляра?Я использую Weld для реализации CDI.
Я также обнаружил, что это работает в конструкторе:
public MyImplementation() {
CDI<Object> cdi = CDI.current();
BeanManager bm = cdi.getBeanManager();
AnnotatedType<MyImplementation> myType = bm.createAnnotatedType(MyImplementation.class);
Set<Bean<?>> beans = bm.getBeans(MyImplementation.class);
Bean<?> bean = bm.resolve(beans);
@SuppressWarnings("unchecked")
CreationalContext<MyImplementation> cc = (CreationalContext<MyImplementation>)bm.createCreationalContext(bean);
bm.createInjectionTarget(myType).inject(this, cc);
}