2013-09-02 5 views
0

В верхнем ответе на этот вопрос, например: Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean я прочитал, что:Что делает фасоль биком CDI?

Чтобы развернуть CDI бобы, вы должны поместить файл с именем beans.xml в папке META-INF на пути к классам. Как только вы сделаете это, тогда каждый боб в пакет станет CDI bean.

А также сказано, что:

Если вы хотите использовать боб CDI со страницы JSF, вы можете дать ему имя с помощью аннотаций javax.inject.Named.

У меня есть пример кода, который идет как это:

@ManagedBean 
@ViewScoped 
public class SignUpPage { 

    private User user; 

    @PostConstruct 
    public void init() { 
     user = new User(); 
    } 

    @Inject 
    private UserDao userDao; 
// rest of the class 

Так, насколько я понимаю, моя фасоль еще JSF Managed Bean, это не КДИ фасоли (или это?). Кстати, у меня есть beans.xml в папке WEB-INF.

И @Inject работает просто отлично. Кроме того, я могу получить доступ к компоненту с EL просто отлично (что заставляет меня думать, что это все еще JSF Managed Bean)

Класс UserDao выглядит примерно так:

@Stateless 
public class UserDao { 
    EntityManager em; 
    @PostConstruct 
    public void initialize(){ 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistence"); 
     em = emf.createEntityManager(); 
    } 

Таким образом, это, насколько Я знаю EJB.

У меня есть какие-либо CDI-компоненты в этом примере? Как работает @Inject здесь?

Надеюсь, мой вопрос ясен, С уважением!

ответ

2

По КДИ specification, каждый JavaBean является Managed Bean (не путать с JSF @ManagedBean, это другой один) в проекте, где beans.xml присутствует. Таким образом, каждый класс также имеет право на инъекцию зависимости. Обратите внимание, что область по умолчанию этого класса равна Dependent.

+0

Так, например, класс Dao представляет собой EJB + CDI bean. И SignUpPage - управляемый компонент JSF + компонент CDI? –

+0

Да, но это действительно плохая практика, чтобы смешивать CDI с JSF, вы можете получить неожиданные результаты. Поэтому используйте '@ Named' вместо' @ ManagedBean' и убедитесь, что ваши области находятся в пакете 'javax.enterprise.context. *' –

+0

Как насчет смешивания CDI с EJB? Если я изменю SignUpPage только на CDI-компонент (с помощью Named и из указанного вами пакета), можно ли использовать Inject-аннотацию? Если я использую аннотацию EJB, хорошо ли это? –

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