什么使bean成为CDI bean?

时间:2013-09-02 19:56:15

标签: jsf java-ee ejb cdi managed-bean

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

  

要部署CDI bean,必须将名为beans.xml的文件放在a中   类路径上的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 Managed Bean)

UserDao类看起来像这样:

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

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

在这个例子中我有没有CDI bean? @Inject如何在这里工作?

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

1 个答案:

答案 0 :(得分:2)

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