我是EJB的新手,我正在尝试理解Stateless和Stateful bean之间的差异,所以我做了一个简单的例子来测试它们。
@Stateless
public class Service {
private int num;
public Service(){
}
public int getNum() {
return num;
}
public void setNum() {
this.num++;
}
}
@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 {
}
}
有状态的等价物:
@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++;
}
}
@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 {
}
}
这两个例子的行为完全相同,这对我来说是令人惊讶的。有人可以解释这里有什么交易吗?
答案 0 :(得分:8)
您的第一个示例仅偶然返回先前设置的数字:可以在不同的bean实例上调用get方法。它恰好在这种特殊情况下使用相同的实例,但你不能指望它。
第二个保证返回先前设置的数字,前提是另一个请求在调用get方法之前不调用set方法。不应将有状态bean注入servlet。
答案 1 :(得分:3)
您可以使用无状态会话Bean的实例变量,但不保证它们不会在方法调用中保留。如果两种方法的行为相同,则只是意味着您可能在同一会话中跨方法调用获得相同的无状态会话Bean实例。
答案 2 :(得分:0)
您不应该在无状态会话bean中拥有成员字段(aka状态)。对于有状态会话bean,没关系。这就是区别。
答案 3 :(得分:0)
有状态 bean在与客户端的对话(on或many)期间保持初始状态。
在与客户端的对话过程中可以更改无状态 bean状态(它属性)(不影响其他客户端)
如果多次执行,你可以看到差异!!