Информация о @Inject в CDI/Weld и DI/Guice

Я пытаюсь различить (некоторые из них) разницу между CDI и DI.

Что CDI(JSR-299) приносит только DI (JSR-330) относительно @Inject?

Правда ли, что CDI @Injects (так же, как DI), однако жизненный цикл того, что он внедрил, привязан к некоторому контексту / области. Если объект существует в области видимости, когда вы используете @Inject, вы получаете экземпляр, в котором когда-либо был объявлен контекст / область, в котором он был объявлен. Если объект не существует, будет создан новый.

Поэтому, когда вы хотите быть уверены, что вы получаете правильный экземпляр объекта, который вы вводите. т.е. @Inject MyObject myObj; получит экземпляр myObject, который находится в области видимости сеанса (при условии, что я аннотировал его как таковой)

Это правильно?

1 ответ

Решение

Отказ от ответственности: я работаю в Red Hat и являюсь руководителем CDI. Так что мои знания о CDI, вероятно, лучше, чем о других решениях DI. При этом я постараюсь дать вам объективный ответ

Да это правильно

Глядя на соответствующий API:

Вы можете видеть, что CDI гораздо более богат, чем JSR 330. Спецификация AtInject определяет только 1 интерфейс и 5 аннотаций, чтобы обеспечить общий способ объявления и разрешения внедрения. Он не содержит никаких правил относительно управления компонентами или их жизненного цикла. CDI (который реализует JSR 330) - это полная спецификация внедрения зависимостей, реализации которой можно сравнить с Guice или Spring Core.

Среди прочего (события, переносимые расширения, декораторы, перехватчики) CDI добавляет понятие контекста. Как вы сказали, это позволяет автоматически управлять компонентом (bean-компонентами) в его собственном жизненном цикле. Вы можете ввести боб более длинной жизни в более короткую и наоборот (т.е. ввести @RequestScoped фасоль в @ApplicationScoped боб). Менеджер bean сделает всю работу, чтобы дать вам правильный bean относительно активных контекстов.

CDI также имеет более новую версию с JSR 346 (CDI 1.1), выпущенную 9 месяцев назад с Java EE 7. В нее добавлено несколько интересных вещей, касающихся управления жизненным циклом бина. Вы можете использовать его на серверах приложений JBoss Wildlfy 8 или Oracle Glassfish 4 (другие серверы все еще работают на своих версиях Java EE 7) или взять Weld 2.x и загрузить CDI из прослушивателя сервлета или Java SE, если вы предпочитаете выполнять интеграцию самостоятельно,

Сейчас мы работаем над версией 1.2 и готовим предложение JSR для CDI 2.0.

Чтобы узнать больше о CDI, я предлагаю вам прочитать документацию по сварке (Weld - это справочная реализация CDI), которая является очень хорошим введением в спецификацию с точки зрения пользователя.

Другие вопросы по тегам