EJB基础三 有状态EJB

有状态EJB其实是类似于CDI中的依赖作用域。就是你需要一个有状态EJB的时候,就会新建一个有状态EJB。因为根据需求创建的,所以每个请求都有一个,这样才可以保存状态,故成为有状态EJB

无状态EJBwildfly中默认最大20个,假如有100个请求,那么这20个无状态EJB只能被共享。共享了又怎么能保存客户端的状态呢?购物车就是个明显的有状态EJB,将购物车它放到session里,这样保证一个session一个购物车,就是最明显的有状态EJB的使用例子。有状态EJB和无状态开发的区别就在于注解的不同。有状态使用的是@Stateful注解。

但是在servlet中,由于servlet是单例的,所以两者并没有不同。一旦注入就一直是这个对象。就相当于是无状态了,所有的请求都使用这同一个EJB

CDI不同,CDIbean如果是请求作用域的,那么在来了新的请求之后,CDI会把servlet字段重新赋值。尽管servlet是单例的,但是servlet里注入的对象不是单例的,这点可以在我的CDI博文中看到。

所以使用servlet+EJB的方式开发直接用@EJB注入EJB是不能发挥有状态EJB的功能的。同样,无状态EJB的对象池也不能充分应用。

我们可以做个实验。

@WebServlet("/hello.html")
public class HelloServlet extends HttpServlet{
 
	private static final long serialVersionUID = 1L;
	@EJB
	private HelloBean helloBean;
	@EJB
	private StatelessBean statelessBean;
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().append("The stateful ejb is ").append(helloBean.id+"").append(".");
		resp.getWriter().append("The stateless ejb is ").append(statelessBean.id+"").append(".");
	}
}

下面是两个简单的有状态EJB和无状态EJB

@Stateful
public class HelloBean {
	public long id;
	public HelloBean() {
		super();
		id = System.currentTimeMillis();
	}
 
}

@Stateless
public class StatelessBean {
	public long id;
	public StatelessBean() {
		super();
		id = System.currentTimeMillis();
	}
}

在浏览器上运行会发现,无论怎么刷新浏览器,无论换什么浏览器,结果都是一样的,这证明了我上面的言论。

 EJB基础三 有状态EJB_第1张图片

 EJB基础三 有状态EJB_第2张图片

你可能感兴趣的:(ejb,J2EE)