在这种情况下,"国家"一词有点误导.它所指的是会话状态,这意味着如果客户端进行多次调用,则会话bean无法知道.想象一下一系列的调用:
reserveSeatsOnFlight();chooseMealPreference();confirmBooking().你所拥有的是会话状态,这意味着第二次调用必须与第一次调用相同的bean进行,否则它就没有意义.这就是有状态会话bean的作用.
无状态会话bean可以有实例变量,但这些变量基本上是全局变量.如果您有一个无状态会话bean池(您可能会或可能不会取决于容器决定要做什么),那么这些实例变量可能会也可能不存在从一个调用到下一个调用.所以一般避免实例变量.这种事情还有其他机制.
让我给你举个例子.想象一下这个无状态会话bean的调用:
public void bookFlight(List<Passsenger> passengers, FlightNumber flight, Date date) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果您输入一个实例变量来计算预订数量并在每次调用时递增它,那么后续调用可能会调用不同的bean,因此会看到不同的值.这就是我的意思,它不一定有意义.
回到第一个例子,处理这个问题的一种方法是将状态传递给调用者:
public interface ReservationSystem {
public int createNewBooking();
public int reserveSeatsOnFlight(int bookingId, int seats);
public int chooseMealPreference(int bookingId, ...)
...
}
Run Code Online (Sandbox Code Playgroud)
看看上面的内容如何不再具有会话状态?它确实如此,但它现在封装在bookingId你传递的内容中.无状态会话bean可以检索预订并从另一个停止的地方继续.
| 归档时间: |
|
| 查看次数: |
2279 次 |
| 最近记录: |