无状态 bean 的行为类似于有状态会话 bean - 为什么?

Stateless bean behaves like stateful session bean - why?

我是 JavaEE 的新手,我试图找出无状态和有状态会话 bean 之间的区别。目前我理解的内容:

1.) 在 stateful 会话 bean 中,bean 的状态与客户端绑定;因此,只要我们与同一用户处于同一会话中,bean 实例的状态就应该相同

2.) 在 stateless 会话 bean 中,会话和客户端没有状态绑定;事实上,bean 实例可以根据用户的每次调用或请求进行交换

为了尝试这个,我写了一个简短的 servlet,它只打印出对无状态 bean 的每个请求的命中数。这是 servlet:

package com.java.ee.ejb.stateless;

import java.io.IOException;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet
public class StateLessServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @EJB
    private StateLessBean stateLessBean;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        System.out.println(stateLessBean);
        stateLessBean.increaseHits();

        resp.getWriter().write("<h1>Hits: "+stateLessBean.getHits()+"<h1>");

    }

}

这是无状态 bean:

package com.java.ee.ejb.stateless;

import javax.ejb.Stateless;

@Stateless
public class StateLessBean {

    private int hits;


    public void increaseHits() {
        hits++;
    }


    public int getHits() {
        return hits;
    }



}

但似乎是,我每次都在同一个对象上调用这些方法——这不应该恰恰相反吗,这意味着当我使用无状态会话 bean 时,每次都在不同的实例上调用?我忘了什么吗?

有状态会话 bean 为每个客户端保持 状态。您看到的状态是保存在无状态会话 Bean 实例上的状态。

当您创建无状态会话 Bean 时,应用程序服务器通常会创建这些 Bean 的池。我建议您的实现是创建一个 1 的池。因为它们是无状态的(您的不是!),这意味着多个线程可以在同一个实例上运行而不会产生任何影响。

由应用服务器决定是否要创建无状态会话 bean 的多个实例。