Проблемы с инжекцией зависимости от сварки
У меня есть POJO, который я создаю для хранения контекста для клиента RESTful API, похожего на этот (настоящий класс является проприетарным).
class MyPOJO {
@Inject
public AnInjectedInterface obj1;
@Inject
public AnotherInjectedInterface obj2;
public String data1;
public int data2;
public long data3;
}
Я хочу использовать это так:
MyPOJO pojo = new MyPOJO();
pojo.data1 = "something";
pojo.data2 = 43;
pojo.data3 = 2875640;
pojo.obj1.someFunction();
pojo.obj2.anotherFunction("something");
Если я делаю это, obj1 и obj2 всегда равны нулю. Эти интерфейсы используются в других классах, отличных от POJO, и вводятся правильно. Они являются зависимыми объектами, и приведенный выше код появляется в bean-объекте приложения, поэтому я не могу внедрить туда POJO.
У меня вопрос такой; DI недоступен в объектах, которые не создаются контейнером? Если да, то есть ли способ сообщить контейнеру создать экземпляр моего зависимого POJO в компоненте, определяемом приложением, с зависимостями? Если нет, что я делаю не так? Мой контейнер - Wildfly 11.
Спасибо.
1 ответ
Ты делаешь это неправильно. Вместо того, чтобы использовать MyPOJO pojo = new MyPOJO();
ты только @Inject MyPOJO pojo
в какой класс (бин) вы хотите использовать его.
CDI / Weld делает создание для вас, и в то же время он решит все внутренние зависимости (obj1
а также obj2
в твоем случае).
Я вижу, что вы отредактировали вопрос, так что вот другие биты ответов.
Прежде всего, вы можете ввести @Dependent
в @ApplicationScoped
и если вам нужно несколько экземпляров, вы можете использовать Instance<MyPOJO>
и на каждом get()
Вы должны получить новый экземпляр. Но учтите, что вам необходимо убедиться, что вы избавляетесь и от этих объектов!
DI недоступен в объектах, которые не создаются контейнером?
По умолчанию CDI не будет обрабатывать его в любом случае. Однако вы можете выполнить инъекцию в такой объект самостоятельно. Чтобы оставаться точным, объект, в который вы вводите, будет обрабатываться как InjectionTarget
и вам понадобится BeanManager
сделать это. Вот примерно как (не код копирования-вставки):
BeanManager beanManager; // assuming you have obtained BM somehow
CreationalContext<Object> ctx = beanManager.createCreationalContext(null);
InjectionTarget<MyPOJO> injectionTarget = beanManager
.getInjectionTargetFactory(beanManager.createAnnotatedType(MyPOJO.class)).createInjectionTarget(null);
injectionTarget.inject(myPojoInstance, ctx);
creationalContext = ctx; // store ctx so you can later on use it to dispose of the dependent instance!