添加@Stateful或@Stateless注释实际上做了什么?

son*_*oom 13 ejb java-ee

我刚刚掌握了Java EE.我知道向类添加@Stateful@Stateless注释会使它成为EJB bean.但是,一旦我这样做,背景中实际发生了什么?我在Wikipedia上看到了与EJB相关的以下内容.

  • 事务处理
  • 与Java Persistence API(JPA)提供的持久性服务集成
  • 并发控制
  • 使用Java消息服务和Java EE连接器体系结构进行事件
  • 异步方法调用

 

  1. 当我将一个类标记为EJB时,上面列出的项目在后台得到"照顾"吗?遵循完全不同的代码路径,一旦我将类作为EJB,就会经历上述每一个,是发生了什么?
  2. 我看到使用CDI我可以选择将EJB bean注入到CDI bean中.在这种情况下,我应该总是使用EJB bean而不是CDI bean,因为EJB bean比CDI bean更强大吗?

Dav*_*ins 5

有关两个问题的一些见解,请参阅此答案.

要回答的重点是:

  • EJB和CDI bean是代理组件,您获得的对象是假的,真实对象是隐藏的,这就是添加服务的方式:caller-> proxy-> services-> realObject
  • CDI和EJB实际上是一样的,可以自由地混合使用.您使用哪种方法取决于您尝试做什么.我倾向于使用CDI,除非我需要该答案中列出的项目之一.然后我只是升级或添加一个新的bean.

请注意,我在答案中错过的一件事是整个@MessageDriven概念.

MessageDriven Beans

将JMS/Connector放在同一行上非常有趣,因为它们正是如此实现的.消息驱动的Bean(MDB)实际上应该称为"连接器驱动的Bean",因为MDB的所有通信和生命周期实际上都与Connector Architecture规范相关联,并且与JMS无直接关系 - JMS只是唯一的Connector人员永远都看到了 那里有很大的潜力.希望我们在Java EE 7中看到一些改进.