2014-02-20 6 views
3

Я пытаюсь различить (некоторые) различия между CDI и DI.Информация о @Inject в CDI/Weld и DI/Guice

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

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

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

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

ответ

7

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

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

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

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

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

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 documentation (Weld - это реализация ссылок CDI), что является очень хорошим введением в спецификацию с пользовательской точки зрения.

+0

Привет Антуан, спасибо, что нашли время ответить на это. Хороший ответ. – johnm

Смежные вопросы