我是 EJB 新手。我听说在某些情况下,在无状态 bean 中存储一些信息(例如配置)是可以接受的。据我了解,无状态 bean 生命周期从 bean 的方法调用开始,以方法结束结束。方法结束后,无状态 bean 将返回到池中。
- 我想知道config字段是否会在每次调用bean的方法时重新初始化,还是仅在创建bean时重新初始化。
- 我还想知道还有哪些信息可以存储在无状态 Bean 私有(private)字段中。
@Stateless
public class MyBean {
private String config = ....;
//.....
}
提前谢谢您。
最佳答案
private String config = ...
在创建 bean 时(通常在应用程序启动期间,但当应用程序服务器决定需要更多 Bean 来处理不断增长的流量时也可能发生)。基本上,当您执行公共(public) bean 的方法时,您保证是该 bean 实例的唯一执行者。在此期间,您可以在私有(private)变量中存储任何内容。但是,一旦返回到调用 bean 的代码,您就永远无法保证后续调用将定向到同一个实例。
示例:
@Stateless
public class MyBean implements MyBeanIntf {
private Object state;
@Override
public void beanMethod() {
state = new Object();
privateMethod();
}
private void privateMethod() {
// it's safe to access 'state' here, will be the one set in
// beanMethod()
}
@Override
public void otherMethod() {
}
}
@Stateless
public void MyBeanClient {
@EJB
private MyBean myBean;
someMethod() {
myBean.beanMethod();
// Not necessarily the same instance that executed beanMethod
// will execute otherMethod
myBean.otherMethod();
}
}
这是理论。在实践中,我会避免依赖于在无状态 EJB 中保留内部临时状态的代码 —— 只是因为这种风格向其他程序员表明,一般来说拥有 SLSB 的状态是可以的,这会导致代码困惑和潜在的错误(特别是如果之前执行的状态被错误地选择为当前状态)。
关于jakarta-ee - 无状态bean : private field reinitialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17265222/