Jakarta ee 为什么使用无状态会话bean进行事务划分

Jakarta ee 为什么使用无状态会话bean进行事务划分,jakarta-ee,transactions,ejb,cdi,Jakarta Ee,Transactions,Ejb,Cdi,我经常发现自己将@AppApplicationScope bean转换为SLSB bean,以便使用@TransactionalAttribute 与创建自定义CDI拦截器来开始和结束我可以在任何bean上使用的事务相比,这样做有什么好处?实际上,在Java EE 7附带的新CDI规范中已经实现了@Transactional,因此,您可以将其应用于应用程序中的所有托管bean,其工作方式与@TransactionalAttribute相同。有关更多信息,请查看 CDI与EJB的对比 区别很简单,

我经常发现自己将@AppApplicationScope bean转换为SLSB bean,以便使用@TransactionalAttribute


与创建自定义CDI拦截器来开始和结束我可以在任何bean上使用的事务相比,这样做有什么好处?

实际上,在Java EE 7附带的新CDI规范中已经实现了
@Transactional
,因此,您可以将其应用于应用程序中的所有托管bean,其工作方式与
@TransactionalAttribute
相同。有关更多信息,请查看

CDI与EJB的对比


区别很简单,如果您不需要诸如调度、远程bean、异步行为或安全性之类的东西,请始终使用
CDI
。请参阅任何类型的教程,了解这些特性是什么以及如何实现它们。还要注意,如果您使用
CDI
,那么应用程序中的每个类都将有效地使用
托管Bean
,包括ejbbean。

EJB将成为CDI容器提供的一组专门服务

因此,要解决您的问题: 默认情况下,EJB能够完成cdi无法完成的某些任务:

  • 计时器
  • 异步、事务性执行以及未来的支持
  • 池:对于阻止拒绝服务攻击非常重要
  • 监视-所有EJB都通过JMX公开,可以使用JConsole进行监视
  • 声明性,“约定优先于配置”事务。如果没有EJB3,您将陷入相当大的膨胀
因此,如果您只使用事务方面,那么cdi+拦截器和EJB之间并没有太大区别


来源:

Apache DeltaSpike就是这样做的,如果它最终进入CDI规范,我不会感到惊讶。这很有趣,但它没有说明使用SLSB优于托管bean的优点。SLSB和CDI bean由容器管理。服务可能不同,但生命周期始终是可管理的。