我想用CDI开发一个应用程序(我经常使用Spring)来发现这项技术。
我已经阅读了许多关于CDI的文章,以了解它是如何工作的。我有一个关于事务管理的简单问题(例如,对于数据库中的持久性):
是否必须使用EJB 3.1进行事务管理,或者是否可以仅使用CDI进行管理?
感谢。
答案 0 :(得分:8)
不,你可以用CDI做到这一点。您只需创建一个启动,提交或回滚事务的拦截器。这真的不是那么难。在Java EE 7中,对于将成为CDI拦截器的所有托管bean(JSF,CDI,EJB等),将有@Transactional
。
编辑:如果你想看一些已经完成的工作,Apache DeltaSpike和Seam 3(不再开发)有拦截器来处理交易。
答案 1 :(得分:2)
事务管理是一个不同的API,因此与CDI或EJB一起使用的天气并不重要。
答案 2 :(得分:2)
到目前为止(直到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直接暴露给View Tier,不需要@Interceptor,但是,不要滥用这种方法,你可以在View和Control层之间进行高度耦合
来自JavaEE7规范:“虽然CDI,JSF和EJB都已经建立在一个称为托管bean的常见但非常抽象的概念上,但似乎JSF Managed Beans可能会被弃用以支持CDI,而EJB可能会被改造为一套CDI服务。“
参考文献: