无状态和有状态 Enterprise Java Bean

2024-03-11

我正在阅读 Java EE 6 教程,并试图了解无状态会话 bean 和有状态会话 bean 之间的区别。如果无状态会话 Bean 在方法调用之间不保留其状态,为什么我的程序会这样运行?

package mybeans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}

客户端

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;

@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        mybean.increment();
        out.println(mybean.getNumber());
    }

}

我原以为 getNumber 每次都会返回 0,但它返回 1,并且在浏览器中重新加载 servlet 会增加更多。问题在于我对无状态会话 Bean 如何工作的理解,当然与库或应用程序服务器无关。有人能给我一个简单的 hello world 类型的无状态会话 bean 示例,当您将其更改为有状态时,它的行为会有所不同吗?


无状态会话 Bean (SLSB) 是not tied对于一个客户,有没有保证对于一个客户端来说,每次方法调用都会获得相同的实例(某些容器可能会在每个方法调用会话中创建和销毁 bean,这是一个特定于实现的决策,但实例通常是池化的 - 而且我没有提到集群环境)。换句话说,虽然无状态 bean 可能有实例变量,但这些字段并不特定于某个客户端,因此 不要在远程调用之间依赖它们。

相比之下,有状态会话 Bean (SFSB) 是投入的对于一个客户的整个生命周期,没有实例的交换或池化(在钝化后可能会从内存中逐出实例以节省资源,但那是另一回事了)并且维持对话状态。这意味着 bean 的实例变量可以在方法调用之间保存与客户端相关的数据。这使得相互依赖的方法调用成为可能(一个方法所做的更改会影响后续方法调用)。多步骤流程(注册流程、购物车、预订流程...)是 SFSB 的典型用例。

还有一件事。如果您使用 SFSB,那么您必须避免注射它们到本质上是多线程的类中,例如 Servlet 和 JSF 托管 bean(您不希望它被所有客户端共享)。如果要在 Web 应用程序中使用 SFSB,则需要执行 JNDI 查找并将返回的 EJB 实例存储在HttpSession未来活动的对象。像这样的东西:

try {
    InitialContext ctx = new InitialContext();
    myStateful = (MyStateful)ctx.lookup("java:comp/env/MyStatefulBean");
    session.setAttribute("my_stateful", myStateful);
} catch (Exception e) {
    // exception handling
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无状态和有状态 Enterprise Java Bean 的相关文章

随机推荐