【问题标题】:using class level variable in class which handle multiple request在处理多个请求的类中使用类级别变量
【发布时间】:2015-03-24 12:01:32
【问题描述】:

我有一个如下编写的类,方法doSomethingForMe() 从servlet 调用。 servlet 可以为同一方法发出多个请求。 Servlet 从 Spring 获取对象。由于此类正在由 Spring Bean 工厂初始化。

public class ClassLevelVariableTest
{
  private List<String> errorLists;

   public void doSomethingForMe()
   {
     errorLists = new ArrayList<>();
     // plus do the rest functionality
     if (!errorLists.isEmpty())
      {
        prepareErrorList(errorLists);
      }
   }

  private void prepareErrorList(List<String> errorLists)
  {
    for (String errorString : errorLists)
    {
      System.out.println(errorString);
    }
  }
}

所以我的第一个查询是:在后续请求中是否有机会获得errorLists 变量的相同对象?

是否有机会让第二个请求覆盖该变量?

【问题讨论】:

  • 不,没有机会,因为每次调用该方法时您都在创建new Object of ArrayList !!
  • 你必须在servlet中创建这个类的一个新对象,对吧?如果每次都有新对象,对errorList变量有什么影响?
  • 我也在用弹簧。所以 ClassLevelVariableTest 类是一个spring bean。所以不会有新的运营商。

标签: java multithreading servlets


【解决方案1】:

如果您的 bean 为每个请求都实例化,那么不,您很好。如果 Spring 为每个请求注入一个重用的,那么你就有问题了。您可以通过不将 errorLists 存储为实例变量来轻松解决此问题。将您的代码更改为:

public class ClassLevelVariableTest
{

    public void doSomethingForMe()
    {
         List<String> errorLists = new ArrayList<>();

您似乎没有使用 errorLists 作为实例变量,所以应该没问题。

【讨论】:

  • ** 如果 Spring 为每个请求注入一个重复使用的单个,那么您就有问题了。**。我们如何确认这一点?
  • 我不再使用 Spring,所以不确定最好的方法,但你可以在构造函数中放置一个 print 语句,看看它是否被多次构造
  • 我自己找到的。 bean 的范围可以在应用程序上下文中定义。默认的是单例。因此,在我的情况下,它将为每个应用程序创建一个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2022-06-16
相关资源
最近更新 更多