SessionScoped

@SessionScoped
public class SessionScopedClass implements Serializable {
    //This class gets constructed once per session, and is shared among all CDI-managed classes within that session. Notice that it implements Serializable, since the instance will get put on the session.

    @Inject
    public SessionScopedClass(SomeDependency someDependency) {
        doSomethingWith(someDependency);
    }

    public SessionScopedClass() {
        //Note that it is required that a session scoped class have a public no-args constructor
    }

}

每个会话将创建一个使用 @SessionScoped 注释的类,并且同一会话中的两个对象将共享会话范围类的相同实例。

重要的是要注意会话作用域类应该实现 Serializable。存在此要求是因为 bean 将存储在该特定会话范围实例的 servlet 容器的会话中。通常,放入会话的任何对象都需要可序列化,原因有两个:首先,会话可能会在一定量的不活动后保留到磁盘以节省内存。这被称为会话钝化,它需要序列化。第二个原因是,在高可用性群集中,通常使用会话复制,以允许群集中的任何服务器为给定会话提供服务请求。这通常也需要序列化。

与请求作用域和应用程序作用域类似,会话作用域类必须具有公共的无参数构造函数。