gpt4 book ai didi

jsf - 使用@EJB 时,每个托管bean 是否都有自己的@EJB 实例?

转载 作者:行者123 更新时间:2023-12-04 01:51:23 24 4
gpt4 key购买 nike

我正在将 JSF 2.2 用于 Web 项目,我现在正在实现登录页面。

我有一个 login.xhtml用作查看 ,以及一个名为 UserLoginView 的支持 bean .
这个 bean 有一个 EJB属性 bean private UserService userService (如图 here )。

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

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

最佳答案

Does this mean that each new UserLoginView gets a new instance of UserService?



没有。给定的 UserService@Stateless EJB。 @Stateless EJB 被池化并作为容器自动生成的可序列化代理注入(inject)。其中,EJB 发生异常时的堆栈跟踪就是这方面的证据。您会看到支持 bean 方法和 EJB 方法之间的额外层。
@Stateless 的自动生成代理类EJB 看起来大致是这样的(实际上它更复杂,例如还需要在此处获取、启动和提交 DB 事务,具体取决于 EJB 类和/或方法的 @TransactionAttribute):
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 池中获取一个可用实例,然后将方法调用委托(delegate)给它,最后将其释放到池中以供将来重用。正是这个代理实例实际上被注入(inject)到您的 JSF 托管 bean 中。

顺便说一句,CDI 也以这种方式工作。这就是为什么使用 CDI 可以将一个范围更窄的 bean 注入(inject)一个范围更广的 bean 中并且仍然让它按预期工作的原因。 JSF的 @ManagedBean注入(inject)实际实例,因此它不能那样工作。如果 JSF 也使用通过 FacesContext 实际获取当前 bean 实例的代理,它会起作用。并委托(delegate)给它。

仅限 @Stateful EJB 实际上与客户端的生命周期相关联。如果托管 bean 作为客户端,它确实会获得“它自己的”实例。另见 JSF request scoped bean keeps recreating new Stateful session beans on every request?

@Singleton EJB 在池中基本上最多有一个实例。所以每个客户端总是会得到相同的实例。

Is ok to implement it like this in a production environment?



绝对地。否则他们就不存在了。

关于jsf - 使用@EJB 时,每个托管bean 是否都有自己的@EJB 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com