【问题标题】:Stateless bean: private field reinitialization无状态bean:私有字段重新初始化
【发布时间】:2013-06-20 08:30:40
【问题描述】:

我是 EJB 的新手。我听说在某些情况下,将一些信息(例如配置)存储在无状态 bean 中是可以接受的。据我了解,无状态 bean 生命周期始于 bean 的方法调用并结束于方法结束。方法结束后,无状态 bean 将返回到池中。

  1. 我想知道 config 字段是否会在每次调用 bean 的方法时或仅在创建 bean 时重新初始化。
  2. 我还想知道还有哪些信息可以存储在无状态 bean 私有字段中。
@Stateless
public class MyBean {

    private String config = ....;

    //.....
}

提前谢谢你。

【问题讨论】:

    标签: jakarta-ee jpa ejb-3.0 stateless-session-bean


    【解决方案1】:
    1. private String config = ... 只会在 bean 的每个 instance 创建时初始化一次(通常在应用程序启动期间,但也可能在应用程序服务器决定更多 bean 时需要处理不断增长的流量)。

    2. 基本上,当您执行公共 bean 的方法时,您肯定是该 bean 实例的唯一执行者。在此期间,您可以将任何内容存储在私有变量中。但是,一旦返回调用 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 的状态,这会导致混淆代码和潜在错误(尤其是如果之前执行的状态被错误地选择为当前状态)。

    【讨论】:

    • 谢谢,给我解释了很多。但是对于“myBean.beanMethod()”可以在两个不同的 bean 上执行什么,我没有正确理解。据我了解,注入只在 MyBeanClient 初始化时执行一次。如何重新初始化其中一个字段?
    • 您不需要重新初始化注入的字段 - 您可以将它们视为随时为您准备的。至于其他人-您可以在每次公共方法调用之前编写一个拦截器来执行此操作。查看“EJB 拦截器”和“@AroundInvoke”关键字。
    • 对不起,我问的问题不正确。我的意思是“myBean”字段(在您的示例中)更改无状态 bean 实例 on fly 是如何发生的?感谢拦截器,从来不知道。
    • 它没有。诀窍在别处:private MyBean myBean 字段实际上不是MyBean 类型,而是由容器生成的代理,它与MyBean 类型兼容。该代理负责查找 bean 的真实实例并将执行传递给它。
    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多