有状态会话bean与无状态会话bean,实例变量困境

时间:2012-05-19 00:27:46

标签: java netbeans ejb stateless-session-bean

我有一个无状态会话bean,但是我想添加对另一个bean的引用以便进行一些处理。因此,如果我添加对另一个bean的引用,它会在像这样的实例级变量中显示,

@Stateless
public class AccountFacade extends AbstractFacade<Account> implements AccountFacadeRemote         {
    @EJB
    private BillerFacadeRemote billerFacade;

    public AccountFacade() {
    super(Account.class);
    }

    ... all other methods...
}

问题

现在,根据定义,无状态bean不应该有任何实例级变量。所以我对这个private BillerFacadeRemote billerFacade;放在哪里感到很困惑?

2 个答案:

答案 0 :(得分:2)

你的代码很好。

@EJB注释是将bean注入到您的类中,应用程序服务器管理它的生命周期。

我建议阅读或浏览相当长的Java EE tutorial

“EJB容器通常创建并维护一个无状态会话bean池,开始无状态会话bean的生命周期。容器执行任何依赖注入,然后调用注释@PostConstruct的方法(如果存在)。现在bean已准备好让客户调用其业务方法。“

答案 1 :(得分:1)

无状态bean可以使用表示依赖关系的实例变量。

事实上,这甚至受到鼓励。如果没有实例变量,您可以在许多情况下仅在实用程序类中使用静态方法。

然而,不鼓励的是,具有表示客户端可观察状态的实例变量。 是错误的,但实体管理器,jms队列,JDBC连接等依赖关系,以及无状态服务委托(部分)其工作的其他服务,绝对没问题。

请注意,注入是实例变量中的真实实例注入。 类级别(静态)注入。