我想用 CDI 开发一个应用程序(我通常使用 Spring)来发现这项技术。
我已经阅读了很多关于 CDI 的文章来了解它是如何工作的。我有一个关于事务管理的简单问题(例如数据库中的持久性):
是否必须使用 EJB 3.1 进行事务管理,还是只能使用 CDI 进行管理?
谢谢。
我想用 CDI 开发一个应用程序(我通常使用 Spring)来发现这项技术。
我已经阅读了很多关于 CDI 的文章来了解它是如何工作的。我有一个关于事务管理的简单问题(例如数据库中的持久性):
是否必须使用 EJB 3.1 进行事务管理,还是只能使用 CDI 进行管理?
谢谢。
不,你可以用 CDI 做到这一点。您只需要创建一个启动、提交或回滚事务的拦截器。这真的没那么难。在 Java EE 7 中,将有一个@Transactional
用于所有托管 bean(JSF、CDI、EJB 等)的 CDI 拦截器。
编辑:如果你想看看一些已经完成的,Apache DeltaSpike 和 Seam 3(不再开发)有拦截器来处理事务。
事务管理是一个不同的 API,因此无论您将它与 CDI 还是 EJB 一起使用都没有关系。
到那时(直到 Java EE 7 到来),您可以将 CDI(不再有 @ManagedBean)与 EJB(事务功能)混合在一起,就像 Adam Bien 在他的帖子中展示的那样:
@Stateless
@Named("helloService")
public class HelloService {
@EJB ClockService clockService;
public String getHello(){
return "Hello from EJB / CDI: " + clockService.currentTime();
}
}
这样做的好处是您的 EJB 直接暴露给视图层,不需要@Interceptor,但是,不要滥用这种方法,您可能会在视图层和控制层之间高度耦合
来自 JavaEE7 规范:“虽然 CDI、JSF 和 EJB 都建立在一个通用但非常抽象的概念上,称为托管 bean,但似乎 JSF 托管 Bean 可能会被 CDI 取代,而 EJB 可能会被改装为一组 CDI服务。”
参考: