5

我想用 CDI 开发一个应用程序(我通常使用 Spring)来发现这项技术。

我已经阅读了很多关于 CDI 的文章来了解它是如何工作的。我有一个关于事务管理的简单问题(例如数据库中的持久性):

是否必须使用 EJB 3.1 进行事务管理,还是只能使用 CDI 进行管理?

谢谢。

4

3 回答 3

8

不,你可以用 CDI 做到这一点。您只需要创建一个启动、提交或回滚事务的拦截器。这真的没那么难。在 Java EE 7 中,将有一个@Transactional用于所有托管 bean(JSF、CDI、EJB 等)的 CDI 拦截器。

编辑:如果你想看看一些已经完成的,Apache DeltaSpike 和 Seam 3(不再开发)有拦截器来处理事务。

于 2013-01-06T07:38:26.037 回答
2

事务管理是一个不同的 API,因此无论您将它与 CDI 还是 EJB 一起使用都没有关系。

于 2013-01-27T14:17:22.063 回答
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 直接暴露给视图层,不需要@Interceptor,但是,不要滥用这种方法,您可能会在视图层和控制层之间高度耦合

来自 JavaEE7 规范:“虽然 CDI、JSF 和 EJB 都建立在一个通用但非常抽象的概念上,称为托管 bean,但似乎 JSF 托管 Bean 可能会被 CDI 取代,而 EJB 可能会被改装为一组 CDI服务。”

参考:

  1. http://www.adam-bien.com/roller/abien/entry/ejb_3_1_killed_the

  2. http://jdevelopment.nl/open-source/java-ee-7-progress-page/

于 2013-05-04T18:02:13.303 回答