Java Bean将不止一次创建

时间:2013-07-16 05:39:18

标签: java java-ee javabeans

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

我怎能阻止它?我只想要一个像Bean一样的Bean实例。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

请参阅文章Contexts and Dependency Injection in Java EE 6。它说:

  

在注入过程中,容器会创建一个@Stateful bean。

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

如果你想让你的bean成为一个单例,最好将它注释为@Stateless,并且 make 它是无状态的:它的行为不应该依赖于任何实例变量的状态。这意味着,如果两个线程同时访问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 无状态。