Java 无状态会话bean

Java 无状态会话bean,java,jakarta-ee,ejb-3.0,Java,Jakarta Ee,Ejb 3.0,无状态会话bean不维护状态。那么这是否意味着它们不应该有实例变量呢 谢谢, 罗杰在这种情况下,“国家”一词有点误导。它所指的是会话状态,这意味着如果一个客户端进行多次调用,会话bean将无法知道。想象一系列调用: reserveSeatsOnFlight() 选择MealPreference() confirbooking() 您所拥有的是会话状态,这意味着第二个调用必须与第一个调用相同,否则就没有意义了。有状态会话bean就是这样做的 无状态会话bean可以有实例变量,但它们本质上是全局

无状态会话bean不维护状态。那么这是否意味着它们不应该有实例变量呢

谢谢,
罗杰

在这种情况下,“国家”一词有点误导。它所指的是会话状态,这意味着如果一个客户端进行多次调用,会话bean将无法知道。想象一系列调用:

  • reserveSeatsOnFlight()
  • 选择MealPreference()
  • confirbooking()
您所拥有的是会话状态,这意味着第二个调用必须与第一个调用相同,否则就没有意义了。有状态会话bean就是这样做的

无状态会话bean可以有实例变量,但它们本质上是全局变量。如果您有一个无状态会话bean池(这可能取决于容器决定做什么,也可能不取决于容器决定做什么),那么从一个调用到下一个调用,这些实例变量可能存在,也可能不存在。所以一般避免使用实例变量。这类事情还有其他机制

让我给你举个例子。想象一下在无状态会话bean中的调用:

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();
        }
    ...
    }