Jsf 什么使一个bean成为CDI bean?

Jsf 什么使一个bean成为CDI bean?,jsf,jakarta-ee,ejb,cdi,managed-bean,Jsf,Jakarta Ee,Ejb,Cdi,Managed Bean,在这个问题的顶部答案中,例如:我读到: 要部署CDIBeans,必须在 类路径上的META-INF文件夹。一旦你这么做了,所有的豆子 该包成为CDIBean 据说: 如果您想从JSF页面使用CDIBean,可以给它一个 使用javax.inject.Named注释命名 我有一个这样的示例代码: @ManagedBean @ViewScoped public class SignUpPage { private User user; @PostConstruct pub

在这个问题的顶部答案中,例如:我读到:

要部署CDIBeans,必须在 类路径上的META-INF文件夹。一旦你这么做了,所有的豆子 该包成为CDIBean

据说:

如果您想从JSF页面使用CDIBean,可以给它一个 使用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
@Stateless
public class UserDao {
    EntityManager em;
    @PostConstruct
    public void initialize(){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistence");
        em = emf.createEntityManager();
    }
据我所知,我的bean仍然是一个JSF管理的bean,它不是cdibean(或者是吗?)。顺便说一下,我的WEB-INF文件夹中有一个beans.xml

而且@Inject在这里工作得很好。此外,我还可以使用EL访问bean(这使我认为它仍然是一个JSF管理的bean)

UserDao类如下所示:

@ManagedBean
@ViewScoped
public class SignUpPage {

    private User user;

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

    @Inject
    private UserDao userDao;
// rest of the class
@Stateless
public class UserDao {
    EntityManager em;
    @PostConstruct
    public void initialize(){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistence");
        em = emf.createEntityManager();
    }
所以,据我所知,这是一个EJB

那么在这个例子中我有CDIBean吗?@Inject在这里是如何工作的


希望我的问题清楚,谢谢

通过CDI,每个JavaBean在存在
Bean.xml
的项目中都是一个
托管Bean
(不要将其与JSF
@ManagedBean
混淆,这是另一个)。因此,每个类都有资格进行依赖注入。注意,这个类的默认作用域是依赖的,因此这里的Dao类就是一个EJB+CDIBean。SignUpPage是一个JSF管理的Bean+一个cdibean?是的,但是将CDI与JSF混用是一个非常糟糕的做法,您可能会得到意想不到的结果。因此,请使用
@Named
而不是
@ManagedBean
,并确保您的作用域来自包
javax.enterprise.context.*
将CDI与EJB混合使用如何?如果我将SignUpPage更改为仅CDIBean(使用您提到的包中的命名和),使用InjectAnnotation可以吗?如果我使用EJB注释,也可以吗?您甚至可以一次性使用CDI、EJB和JSFbean:-),对于第一个问题-是的,您可以对EJB bean使用
@Inject
,这甚至是一个很好的实践。如果你对远程EJB感兴趣,你只需要
@EJB
,谢谢,我不知道。这样我就可以有一个无状态的ManagedBean,它是会话处理的?这令人困惑。。