Инъекция CDI при создании экземпляра бина вручную
Я знаю, что вопрос такого рода возвращается регулярно, но мне интересно, есть ли способ вручную создать экземпляр компонента (с новым Xxxx()) и выполнить инъекцию. Может быть, с помощью BeanManager, но я не знаю, как это сделать.
Если это невозможно, мне интересно, почему это не было сделано. Концептуально я не вижу веских причин, чтобы сделать это невозможным.
Спасибо за ваше объяснение.
PS: я работаю с JBoss 7.1.1 и контейнером Weld CDI.
JM.
1 ответ
Потому что фундаментальной концепцией, лежащей в основе CDI, является понятие областей и связанного с ними контекста. Это контексты в контекстах и внедрение зависимостей. По сути, бин с областью имеет четко определенный жизненный цикл, но когда вы сами создаете экземпляр бина, он больше не говорит, каков его жизненный цикл. Прочтите раздел 2.4 Области применения спецификации CDI.
Чтобы дать вам немного больше понимания - CDI не только @Inject
ваши зависимости, но и управляет их жизненным циклом. Это выходит за рамки простого инстанцирования и внедрения зависимости в завершение (вызов @PreDestroy
) не только для самого экземпляра компонента, но и для всех зависимых экземпляров. Когда вы сами создаете бин, неясно, когда делать эту последнюю часть.