用于无状态和有状态bean差异的EJB示例

Evg*_*rov 3 java ejb java-ee

我是EJB的新手,我正在尝试理解Stateless和Stateful bean之间的差异,所以我做了一个简单的例子来测试它们.

@Stateless
public class Service {

private int num;

    public Service(){
    }

    public int getNum() {
        return num;
    }

    public void setNum() {
        this.num++;
    }
}
Run Code Online (Sandbox Code Playgroud)
@WebServlet("/Controller1")
public class Controller1 extends HttpServlet {
    @EJB
    private Service serv;

    public Controller1() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        serv.setNum();
        response.getWriter().println(serv.getNum());
    }

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

    }

}
Run Code Online (Sandbox Code Playgroud)

和有状态的等价物:

@Stateful
public class ServiceStateful implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int num;

    public ServiceStateful(){
    }

    public int getNum() {
        return num;
    }

    public void setNum() {
        this.num++;
    }
}
Run Code Online (Sandbox Code Playgroud)
@WebServlet("/Controller")
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    private ServiceStateful serv;

    public Controller() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        serv.setNum();
        response.getWriter().println(serv.getNum());
    }

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

    }

}
Run Code Online (Sandbox Code Playgroud)

两个例子的行为完全相同,这对我来说是令人惊讶的.有人可以解释这里有什么交易吗?

JB *_*zet 8

您的第一个示例仅偶然返回先前设置的数字:可以在不同的bean实例上调用get方法.它碰巧在这种特殊情况下使用相同的实例,但你不能指望它.

如果另一个请求在调用get方法之前没有调用set方法,则第二个保证返回先前设置的数字.不应将有状态bean注入servlet.

  • 只是添加"SFSB后面的基本原理不应该注入到servlet中" - 因为servlet实例只为所有请求创建一次,所以最终只会将一个SFSB注入到servlet中.如果每个用户需要1个SFSB,则应该为每个新用户执行JNDI查找,并在用户会话中存储对它的引用.对SFSB执行JNDI查找可确保每次都返回一个新实例. (6认同)