【问题标题】:Java Bean will create more than onceJava Bean 将创建不止一次
【发布时间】:2013-07-16 05:39:17
【问题描述】:

我想使用 Enterprise Java Beans 创建一个网络日历。所以我编写了一个有状态的 CalendarBean 类(@Stateful)。作为一个属性,我使用双端队列来存储所有日期。或者,我可以在最后或开始时添加新的一年。 在 JSP 中,我使用 <jsp:useBean>-Tag。 在每次调用 JSP 时,都会创建一个新的 Bean 实例。每次它创建一个新的双端队列。

我该如何预防呢?我只想要一个像 Singleton 一样的 Bean 实例。

【问题讨论】:

  • 来吧,伙计,很明显,它是 STATEFUL,所以这意味着它依赖于请求状态,你需要无状态 bean :)

标签: java jakarta-ee javabeans


【解决方案1】:

在有状态会话 Bean 中,实例变量表示唯一客户端 bean 会话的状态。因此,每个客户端都有自己的实例。如果你想要 Bean 的实例,你可以使用 Statefull Session bean 或 Singleton Session bean。 你可以看到:http://docs.oracle.com/javaee/5/tutorial/doc/bnbly.html

【讨论】:

    【解决方案2】:

    见文章Contexts and Dependency Injection in Java EE 6。它说:

    @Stateful bean 在注入期间由容器创建。

    因此,当您的 JSP 编译运行时,容器将注入一个新的CalenderBean

    如果您希望您的 bean 成为单例,最好将其声明为 @Stateless,并且还使其无状态:它的行为不应依赖于任何实例变量的状态。这意味着,如果两个线程同时访问 bean,它们应该不能通过修改实例变量来影响 bean 对彼此的行为方式。

    例如,如果您的 CalenderBean 有一个实例变量 private Calendar calendar,而您的实例方法执行以下操作:

    this.calendar.set(Calendar.YEAR, input.getYear()); // where input is a parameter
                                                       // to the method you were calling
    return calendar.get(Calendar.ERA);
    

    现在假设两个访问者在完全相同的实例中访问您的网页,但他们有不同的输入:

    • 用户 1 有 input.getYear()2000
    • 用户 2 有 input.getYear()-5

    由于我们不能保证两个线程会被顺序处理,可能会发生以下情况:

    • 为用户 1 服务的线程将年份设置为 2000
    • 为用户 2 服务的线程将年份设置为 -5
    • 为用户 1 服务的线程设置 ERA 并返回 GregorianCalendar.BC

    这显然是错误的:用户 1 影响了 CalendarBean 为用户 2 工作的方式,这样,bean 不是无状态的。

    【讨论】:

    • 也就是说,用户应该不能通过调用JSP中的方法来改变bean?
    • Stateless 没有达到我希望的效果(请参阅顶部评论),如果我使用@Singleton,也不会发生任何事情。现在我创建一个新的 Bean,它有一个(自己的)Calendar 的实例变量,它是一个单例。所以我的清单只会产生一次。我必须使用同步.. :( - 可能是 范围内的问题?我必须选择“会话”而不是“请求”?
    • <jsp:useBean>scope 属性只说明了 bean 可以在哪里找到,或者应该存储在哪里。如果您使用session,则意味着两个连续的HTTP 请求将具有相同的实例,而request 则意味着每个HTTP 请求(即使在同一个会话中)都将具有自己的bean 实例。
    • 好的,谢谢。 :) - 我现在的解决方案:我不再使用 ,而是将@EJB-reference 集成到 servlet 中,然后转发到 JSP。所以我知道,它只是 Bean 的一个实例。
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多