我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java 6年了,但之前从未使用过EJB。至少可以说,我对整个EJB业务的复杂性感到不知所措。我无法理解我在哪里可以实际应用一些概念。
在理解无状态会话bean之后,我想到的一个问题是,你能不能总是用没有本地成员的类的共享实例替换无状态会话bean(实际上使它成为无状态)?我读到了关于无状态会话bean的实例池。如果没有状态,你能不能简单地使用一个实例?
我正在OpenEJB上部署我的示例,我必须使用无状态会话bean的一个地方是与EntityManager进行交互。我不确定我是否可以在任意类中处理EntityManager。除此之外,仍然困惑无状态会话bean试图解决的问题。
答案 0 :(得分:10)
无状态会话bean可能具有状态。但它可能没有会话状态。所以会话bean方法执行以下操作是完全可以接受的(尽管做法不好):
public void foo() {
this.someVar = bar();
this.someOtherVar = baz();
zing();
}
除了池,EJB容器还提供了几个无状态bean服务:
因此,无状态会话bean比简单的无状态单例更有用。
答案 1 :(得分:4)
不,无状态会话bean可以具有状态,但该状态不会持久化/绑定到会话。该状态的一部分是注入EJB或其他可能是有状态bean等的POJO。因此,每个请求都需要一个无状态会话bean。
相比之下,您有一个用于一个用户会话的有状态会话bean,因此该状态被绑定到会话。
答案 2 :(得分:0)
您可以在任意类中处理EntityManager,但真正的问题是您希望如何构建解决方案。
除了使用EJB的EJB复杂性之外,还为您提供了更具伸缩性的解决方案。
如前所述,在开发基于事务的应用程序时,EJB非常有用。 应用程序服务器为您提供了一些设施,包括事务管理,EJB池,安全性等。
当然你可以用“共享课”来实现所有东西,但是为什么你想在已经完全免费的情况下重新发明轮子呢?
无状态会话bean用于将业务逻辑实现为应用程序的核心部分。 在Java EE分层体系结构中,您有3层: 1.演讲 2.忙碌 3.数据
EJB在Businness逻辑中扮演着重要角色。你有两个选择 SLSB和SFSB。第一个更具可伸缩性,由Application Server汇总但无法保持其状态。 第二个是可扩展性较低的,每个客户端会话都有一个SFSB。当您必须在客户端之间保持业务逻辑的对话时使用它们,例如,仅在对SFSB的一次方法调用中无法完成的操作。 即使我建议您仅使用SLSB来管理持久性,SLSB和SFSB也可以保留对EntityManager的引用来管理实体持久性。 EJB3和JPA是一个很好的解决方案。 希望这能帮到你