jsf 1.2中托管bean中的实例变量线程安全

时间:2015-04-05 09:47:00

标签: static thread-safety final jsf-1.2 managed-bean

我们在我们的应用程序中使用JSF 1.2和WAS 6.1。

我来自servlet背景并且理解servlet类的实例变量不是线程安全的,因为实例变量在所有请求之间共享,并且每个请求创建一个新线程并使用doGet或doPost或任何其他处理程序来提供服务。

  1. 如何在JSF 1.2中处理上述场景?
  2. 我们正在使用facesAddress托管bean以及faces-config.xml中的以下条目。 Faces Servlet是否为每个请求创建了ChangeAddressBean的新实例?

    <managed-bean> <managed-bean-name>ChangeAddress</managed-bean-name> <managed-bean-class>com.ChangeAddressBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

  3. 如果第2点的答案是肯定的,那么最终的静态变量如何用于所有请求?最终的静态变量是否仍然适用于所有请求?的价值 anAddressFinder填充在静态块中,但根据某些条件,不同类型的用户的值可能不同。这是否意味着为第一个请求/用户填充的anAddressFinder的值对于所有后续请求/用户将保持相同?

    public class ChangeAddressBean{ int flatNumber; final static AddressFinder anAddressFinder; . . . }

1 个答案:

答案 0 :(得分:0)

  1. 是。 2.&#34; anAddressFinder&#34;的值绑定类定义,而不是特定的类实例。你的假设是正确的。这不是您应该使用的方法。仅基于名称,&#34; AddressFinder&#34;听起来非常像它应该是一个单身人士服务。让Spring管理并在ManagedBean中注入此依赖项。以init()后构造方法或类似方法获取所需数据。通常,请避免在此上下文中使用静态成员。它们使测试更加困难,而且你的情况不是线程安全的。