当使用@EJB时,每个托管bean都得到它自己的@EJB实例吗?

我正在使用JSF 2.2进行Web项目,现在正在实现登录页面。

我有一个用作视图login.xhtml和一个名为UserLoginView的支持bean。
这个bean有一个EJB属性bean private UserService userService (如下所示)。

这是否意味着每个新的UserLoginView都会获得一个新的UserService实例?

可以在生产环境中像这样实现它吗?


这是否意味着每个新的UserLoginView都会获得一个新的UserService实例?

不。 给定的UserService@Stateless EJB。 @Stateless EJB被汇集并注入为容器自动生成的可序列化代理。 除此之外,当EJB发生异常时的堆栈跟踪证明了这一点。 您会在辅助bean方法和EJB方法之间看到额外的层。

自动生成的@Stateless EJB的代理类看起来大致如此(实际上它更复杂,例如DB事务也需要在此处获取,启动和提交):

public class UserServiceProxy extends UserService implements Serializable {

    public User find(Long id) {
        UserService instance = getAnAvailableInstanceFromPool();
        User result = instance.find(id);
        releaseInstanceToPool(instance);
        return result;
    }

    public Long save(User user) {
        UserService instance = getAnAvailableInstanceFromPool();
        Long result = instance.save(user);
        releaseInstanceToPool(instance);
        return result;
    }

    // ...
}

你看到了吗? 它只是从EJB池抓取一个可用的实例,然后将方法调用委托给它,并最终将其释放到池中以备将来重用。 正是这个代理实例实际上被注入到JSF托管bean中。

顺便说一下,CDI也是这样工作的。 这就是为什么CDI有可能在更广泛的bean中注入一个更窄范围的bean,并使其按照预期工作。 JSF的@ManagedBean注入实际的实例,因此它不会那样工作。 如果JSF也使用实际通过FacesContext获取当前bean实例并委托给它的代理,那么它就会起作用。

只有@Stateful EJB实际上与客户端的生命周期相关联。 如果托管bean作为客户端,它确实会获得“自己的”实例。 另请参见JSF请求作用域bean不断在每个请求上重新创建新的有状态会话Bean?


可以在生产环境中像这样实现它吗?

绝对。 否则他们不存在。

链接地址: http://www.djcxy.com/p/50215.html

上一篇: When using @EJB, does each managed bean get its own @EJB instance?

下一篇: @Nullable annotation usage