2014-12-15 3 views
1

Я отлаживаю приложение с использованием Spring. Я нашел что-то странное, когда я вхожу в конструктор ниже в DefaultNamespaceHandlerResolver, который вызывается XmlBeanDefinitionReader. createReaderContext (ресурс ресурсов):Есть ли встроенный поток, управляющий DefaultNamespaceHandlerResolver весной?

public DefaultNamespaceHandlerResolver(ClassLoader classLoader, String handlerMappingsLocation) { 
     Assert.notNull(handlerMappingsLocation, "Handler mappings location must not be null"); 
     this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader()); 
     this.handlerMappingsLocation = handlerMappingsLocation; 
    } 

Там в поле с именем handlerMappings в DefaultNamespaceHandlerResolver, как показано ниже:

private volatile Map<String, Object> handlerMappings; 

После того как я пробегаю выше конструктору, значение этого поля будет изменено, однако, я не могу найти какую-либо подсказку о том, как изменяется ее значение, потому что в вышеперечисленном указателе заданы только класс loader и handlerMappingLocation. Я заметил, что handlerMappings объявлен изменчивым. Поэтому мой вопрос в том, есть ли встроенная нить или другой поток, которые обрабатывают эту запись весной?

+0

Ops ... Может быть, мне нужно спросить Юрген Hoeller для ответа .... –

ответ

0

Кроме того, это меня смущает, я не думаю, что это нет встроенных нити или другого потока манипулирует это поле весной.

Я нахожу, что существует способ toString() следующим образом (here), который будет выполнять метод getHandlerMappings().

@Override 
public String toString() { 
    return "NamespaceHandlerResolver using mappings " + getHandlerMappings(); 
} 

Когда мы отлаживать в IntelliJ или Eclipse, я думаю, что IDE выполнит метод toString() в другом потоке, чтобы показать удобочитаемое значение объекта.

Вот код теста:

public class ToStringTest { 

    public static void main(String[] args) { 

     WilltoStringInvoked will = new WilltoStringInvoked(); 

     // #breakpoint1 
     System.out.println("If breakpoint here value will be 1"); 

     /** 
     * If we set an breakpoint before this method the output will 
     * be 1, otherwise the output will be 0 
     */ 
     System.out.println(will.getValue()); 

     // #breakpoint2 
     System.out.println("If breakpoint here value will be 0"); 
    } 

    static class WilltoStringInvoked { 

     private volatile int value = 0; 

     private int setValue() { 
      if (value == 0) { 
       synchronized (this) { 
        if (value == 0) { 
         value = 1; 
        } 
       } 
      } 

      return value; 
     } 

     public int getValue() { 
      return value; 
     } 

     @Override 
     public String toString() { 
      return "This value is: " + setValue(); 
     } 
    } 
} 
Смежные вопросы