在Java EE 7之前,只有EJB是事务性的,并且
@Transactional注释不存在。
从Java EE 7和JTA 1.2开始,您可以在带有
@Transactional注释的CDI中使用事务拦截器。
要回答有关使用哪种最佳类型的bean的问题,答案默认为CDI。
CDI bean比EJB轻巧,并且支持许多功能(包括成为EJB),并且默认情况下处于激活状态(将
beans.xml文件添加到应用程序时)。由于Java
EE 6
@Inject优先于
@EJB。即使您使用远程EJB(CDI中不存在的功能),最佳实践也建议您
@EJB一次注入远程EJB和CDI生产者以将其公开为CDI
bean
public class Resources { @EJB @Produces MyRemoteEJB ejb;}建议对Java EE资源也是如此
public class Resources2 { @PersistenceContext @Produces EntityManager em;}这些生产者将在以后使用
public class MyBean { @Inject MyRemoteEJB bean; @Inject EntityManager em;}EJB对于它们所包含的某些服务(如JMS或异步处理)仍然有意义,但是您将它们用作CDI bean。



