В верхнем ответе на этот вопрос, например: 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 здесь?
Надеюсь, мой вопрос ясен, С уважением!
Так, например, класс Dao представляет собой EJB + CDI bean. И SignUpPage - управляемый компонент JSF + компонент CDI? –
Да, но это действительно плохая практика, чтобы смешивать CDI с JSF, вы можете получить неожиданные результаты. Поэтому используйте '@ Named' вместо' @ ManagedBean' и убедитесь, что ваши области находятся в пакете 'javax.enterprise.context. *' –
Как насчет смешивания CDI с EJB? Если я изменю SignUpPage только на CDI-компонент (с помощью Named и из указанного вами пакета), можно ли использовать Inject-аннотацию? Если я использую аннотацию EJB, хорошо ли это? –