当使用@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?