2

例如,在这个问题的最佳答案中:Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean我读到:

要部署 CDI bean,您必须将名为 beans.xml 的文件放在类路径上的 META-INF 文件夹中。一旦执行此操作,包中的每个 bean 都将成为 CDI bean。

而且据说:

如果要使用 JSF 页面中的 CDI bean,可以使用 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

据我了解,我的 bean 仍然是 JSF Managed Bean,它不是 CDI bean(或者是吗?)。顺便说一句,我的 WEB-INF 文件夹中有一个 beans.xml。

@Inject 在这里工作得很好。另外,我可以用 EL 访问 bean 就好了(这让我觉得它仍然是一个 JSF 托管 Bean)

UserDao 类看起来像这样:

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

所以,据我所知,它是一个 EJB ..

那么在这个例子中我有任何 CDI bean 吗?@Inject 在这里如何工作?

希望我的问题很清楚,问候!

4

1 回答 1

2

根据 CDI规范,每个 JavaBean 都是存在的项目中的一个Managed Bean(不要将它与 JSF 混淆@ManagedBean,这是一个不同的)beans.xml。所以每个类也有资格进行依赖注入。请注意,此类的默认范围是Dependent.

于 2013-09-02T19:58:51.850 回答