【问题标题】:Difference between Seam Component.getInstance() and JNDI context lookupSeam Component.getInstance() 和 JNDI 上下文查找之间的区别
【发布时间】:2012-08-27 07:42:29
【问题描述】:

我有一个带有以下注释的有状态会话 bean:

@Stateful
@Name("fooBar")
public class FooBarAction implements FooBar {

我注意到有两种方法可以获取我的 FooBar 实例:

接缝查找:

Component.getInstance(FooBarAction.class);

JNDI 查找:

(new InitialContext()).lookup("MYAPP/FooBarAction/local");

当我使用 JNDI 查找时,每次执行查找时,我都会注意到创建了一个新的 FooBar 实例。调用默认构造函数,并使用 setter 方法恢复我的 SFSB 的状态(属性)。

当我使用 Seam 查找时,没有调用默认构造函数,也没有调用 setter 方法。我只有实例。与上一个查找相同的实例。

那么有什么区别呢?最好的使用方法是什么?

【问题讨论】:

    标签: java ejb-3.0 seam jndi


    【解决方案1】:

    来自doc:此方法返回指定组件的单例,因此连续两次使用相同的组件名称调用它会返回相同的组件实例。

    【讨论】:

    • @"Petr Mensik":是的,谢谢。但是为什么 JNDI 查找也不返回单例呢?它正在创建一个新的 SFSB。
    • 因为容器需要总是返回新的实例。原因是 Statefull bean 不是池化的,而是根据用户请求创建的。
    • @"Petr Mensik":所以 Seam 创建了一个 SFSB,并将其放入池/容器中。如果我们调用它,它会从池中获取 SFSB。 JNDI 查找仅将 SFSB 的属性存储在 EJB 缓存中。如果我们调用 SFSB,它将创建一个新实例,并从 EJB 缓存中检索属性并使用 setters 方法将其导入实例中。我说的对吗?
    • @PetrMensik 这不正确。没有 EJB 缓存之类的东西。当您从 JNDI 查找 SFSB 时,您会得到一个干净的新实例。它不会神奇地被赋予状态,因为这取决于客户端。想一想:有 100 个客户端,容器如何知道要恢复哪个状态?如果客户端持有一个实例(代理)并且一段时间不使用它,则容器可能会钝化 bean。如果客户端再次使用该实例,则该特定实例将恢复其状态。如果同一个客户端再次进行 JNDI 查找,它将获得一个完全独立的实例
    • @MikeBraun:所以使用 JNDI,状态是通过钝化 bean 来存储的。但如果我恢复它,它仍然是一个新实例?那么钝化bean有什么用呢?国家会迷路吗?
    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 2014-02-03
    • 1970-01-01
    • 2013-05-28
    • 2010-10-03
    • 2020-10-03
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多