2015-09-01 88 views
0

假设我们有2 EJB的(无状态为例)A和B.EJB注入和EJB池

@Stateless 
public class A { 
    @EJB 
    protected B binstance; 
} 

所以我们的servlet使用了我们的一个bean后,应返回到游泳池和问题是从A的EJB容器“取消引用”B实例,即在下一次调用时,我们可以在同一个A实例内获得另一个B对象? 对于JAX-RS,当我们创建一个bean REST服务并在那里注入其他bean时,它仍然是有效的吗?在这种意义上,JAX-RS bean是否像servlet或类似于普通EJB实例一样创建(我的意思是servlet仍然持有bean实例的引用)?

+0

[无状态bean的实例变量的状态如何保存以用于EJB中的下一个调用?](http://stackoverflow.com/questions/26309050/how-is-state-of-instance-variables-无状态bean保存为未来invoca) – kolossus

+0

JAX-RS资源本身不能合并。由于Java EE 7(和EJB 3.2)将JAX-RS与EJB结合在一起(即使用@Stateless注释JAX-RS资源),JAX-RS将被合并。从池中加载它的所有依赖关系时都会特别连接(同样适用于所有无状态注入的EJB)。 –

+0

问题是A在放入池之前会发生什么? B是从A中提取的,A和B都是独立汇集的,或者只有A返回到池中(因为它提及B,那么B怎么会汇集呢?) – user3070377

回答

0

好的。那么让我们从无状态bean开始吧。无状态bean对象池由bean容器控制。它可以在第一个和第二个请求中提供相同的对象,或者可以提供不同的对象。所以,在编码时,请记住这一点。

现在来到Bean A和Bean B,当bean A执行完成时,Bean B可能会被取消引用。因为这完全取决于Bean容器基于负载以及bean A调用之间的持续时间。 所以永远不要依赖,每次都会得到相同的Bean B对象。

而在JAX-RS的情况下,其余实例与普通EJB实例一样创建。如果rest bean是无状态的,则应用无状态bean规则。在这种情况下,您也将无法控制在辅助休息呼叫中提供给您的实例。