我是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)
两个例子的行为完全相同,这对我来说是令人惊讶的.有人可以解释这里有什么交易吗?
您的第一个示例仅偶然返回先前设置的数字:可以在不同的bean实例上调用get方法.它碰巧在这种特殊情况下使用相同的实例,但你不能指望它.
如果另一个请求在调用get方法之前没有调用set方法,则第二个保证返回先前设置的数字.不应将有状态bean注入servlet.