Java 无状态会话bean
无状态会话bean不维护状态。那么这是否意味着它们不应该有实例变量呢 谢谢,Java 无状态会话bean,java,jakarta-ee,ejb-3.0,Java,Jakarta Ee,Ejb 3.0,无状态会话bean不维护状态。那么这是否意味着它们不应该有实例变量呢 谢谢, 罗杰在这种情况下,“国家”一词有点误导。它所指的是会话状态,这意味着如果一个客户端进行多次调用,会话bean将无法知道。想象一系列调用: reserveSeatsOnFlight() 选择MealPreference() confirbooking() 您所拥有的是会话状态,这意味着第二个调用必须与第一个调用相同,否则就没有意义了。有状态会话bean就是这样做的 无状态会话bean可以有实例变量,但它们本质上是全局
罗杰在这种情况下,“国家”一词有点误导。它所指的是会话状态,这意味着如果一个客户端进行多次调用,会话bean将无法知道。想象一系列调用:
李>reserveSeatsOnFlight()
李>选择MealPreference()
confirbooking()
public void bookFlight(List<Passsenger> passengers, FlightNumber flight, Date date) {
...
}
看看上面的内容如何不再具有会话状态?确实如此,但现在它被封装在您传递的
bookingId
中。无状态会话bean可以检索预订并从另一个停止的地方继续。我经常看到无状态会话bean使用局部变量来维护bean中的“全局”状态(以避免将数据从对象中的一个方法调用传递给另一个方法调用的繁重任务)
话虽如此,这些基本上都是对象中的全局变量,容易被滥用(正如我所看到的大多数情况一样)。我倾向于建议避免使用它们
不过,在某些情况下,它们是有用的。。。您是否考虑了特定的用例?无状态bean可以像任何其他对象一样具有实例变量。它只是不能使用它们来维护特定于特定客户机的值 保存在SLSB启动时初始化的最终实例变量(即在构造函数中)怎么样。 我想到的是在SLSB的构造函数中实例化的DAO属性,如下所示:
@Stateless
public class MyStatelessBean() {
private final CustomerDAO customerDAO;
public MyStatelessBean() {
// Initialization code goes here
this.customerDAO = new CustomerDAO();
}
...
}
因此,DAO可以直接在SLSB的方法中使用,并且不必每次需要DAO时都创建DAO。当然,如果DAO是无状态的,通常情况下就是这样。到数据库的连接当然会按需提供,而不会存储在SLSB本身中
@Stateless
public class MyStatelessBean() {
private final CustomerDAO customerDAO;
public MyStatelessBean() {
// Initialization code goes here
this.customerDAO = new CustomerDAO();
}
...
}