Вопрос по jsf, cdi, managed-bean – Внедрить против ManagedProperty [дубликат]

12

This question already has an answer here:

Backing beans (@ManagedBean) or CDI Beans (@Named)? 5 answers

Итак, у меня есть компонент поддержки JSF, которому нужна ссылка на другой компонент (@NoneScoped).

Должен ли я @Inject его или использовать @ManagedProperty для получения ссылки на экземпляр из контейнера?

Зачем использовать один, а не другой, на мой взгляд, два подхода достигают одного и того же.

Ваш Ответ

2   ответа
6

когда это возможно. CDI более богат в проверке зависимостей времени развертывания, а его поддержка прокси предотвращает утечку области. Это облегчает проверку правильности вашей модели.Производители обычно может использоваться для предоставления кода клея, где это необходимо.

CDI spec Blog post on CDI and EL
Я хотел бы добавить это, подобно тому, как показано ниже, у вас есть такие вещи, как EJB, которые вы можете внедрить с помощью CDI. Вы также можете оставить их вне поля зрения, если не дадите им @Name (что просто делает их доступными для EL). Использование CDI также дает вам точки расширения, превышающие то, что доступно в JSF, но это не является частью вопроса :) Я предлагаю придерживаться CDI.
10

@ManagedProperty а также@NoneScoped прибывает из спецификации JSF 2.0, в то время как@Inject исходит из спецификации CDI.

Если вы просто работаете с приложением сервлета, которое не использует какие-либо другие функции JavaEE 6, перейдите к@ManagedProperty, Эта аннотация также имеет преимущество перед@Inject: вы можете использовать EL (язык выражения) с ним (хотя есть обходные пути, чтобы получить это в CDI).

Обе аннотации / контейнеры, кажется, достигают & quot;the same thing& Quot; но по-разному, и они работают с разными контейнерами. Бины, управляемые CDI, будут доступны JSF, но не наоборот. Если вы аннотируете свои bean-компоненты специфичными для JSF аннотациями, тогда забудьте об использовании пользовательских квалификаторов, перехватчиков, методов-производителей и т. Д. Я обычно предпочитаю подход с CDI, потому что, в конце концов, он более сложный, но выбор будет зависеть от ваших реальных потребностей ,

Подводя итог, кажется, что вы просто используете функции JSF.stick to the @ManagedProperty (CDI не может понять@NoneScoped аннотации, в CDI все бины находятся под@Default область действия, если ничего не указано). Переход на CDI в вашем проекте может означать замену не только@ManagedProperty для@Inject один, но все ваши@RequestScoped (и так далее) для конкретных CDI.

Похожие вопросы