我知道这已经被问过百万次了,但到目前为止它还没有回答我脑海中的问题,我认为最好用代码来理解,有人可以验证我的想法:
客户端中的无状态 bean:
public void work(){
bean.work1(); <--- this uses instance 1 in App Server
...
bean.work2(); <--- this can be instance 2 in App Server
}
客户端中的有状态 bean:
public void work(){
bean.add_item(item); <------- this uses instance 1 in App Server
....
bean.checkout(); <------- this uses instance 1 in App Server
}
销毁会话:
public void work(){
...
bean = null;
}
来自Oracle文档
顾名思义,会话 bean 类似于交互式会话。会话 bean 不共享;它只能有一个客户端,就像交互式会话只能有一个用户一样。当客户端终止时,它的会话 bean 似乎也终止并且不再与客户端关联。
该状态在客户端/bean 会话期间保留。如果客户端移除 bean,会话结束并且状态消失。然而,这种状态的瞬态性质不是问题,因为当客户端和 bean 之间的对话结束时,不需要保留状态
如果以上是正确的,那么我的派生问题是,当 bean 引用设置为 null 时,App 服务器是否会丢弃有状态 bean 实例并创建新实例?我问这是因为:
- 我们向 bean 添加了项目,并将为新客户保留 bean,除非我们实现一个
flush
方法,但我认为这不是正确的方法。 - 如果在最佳实践中 bean 不应该改变自己的状态,即
this.items
在 bean 内部添加项目,我想不出更好的理由来使用 Stateful bean? - “状态”是指 bean 实例本身吗?