From 5d6139eb7a171ecab5f010a60197749460b2645d Mon Sep 17 00:00:00 2001 From: Qimiao Chen Date: Fri, 27 Mar 2020 21:58:55 +0800 Subject: [PATCH] Set initialValue of NamedThreadLocal in XmlBeanDefinitionReader This commit overrides initialValue() of NamedThreadLocal to lazily initialize the set used in XmlBeanDefinitionReader. Closes gh-24800 --- .../beans/factory/xml/XmlBeanDefinitionReader.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java index f6e87a15ac..589208a4d3 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java @@ -128,7 +128,12 @@ public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader { private final XmlValidationModeDetector validationModeDetector = new XmlValidationModeDetector(); private final ThreadLocal> resourcesCurrentlyBeingLoaded = - new NamedThreadLocal<>("XML bean definition resources currently being loaded"); + new NamedThreadLocal>("XML bean definition resources currently being loaded"){ + @Override + protected Set initialValue() { + return new HashSet<>(4); + } + }; /** @@ -319,10 +324,7 @@ public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader { } Set currentResources = this.resourcesCurrentlyBeingLoaded.get(); - if (currentResources == null) { - currentResources = new HashSet<>(4); - this.resourcesCurrentlyBeingLoaded.set(currentResources); - } + if (!currentResources.add(encodedResource)) { throw new BeanDefinitionStoreException( "Detected cyclic loading of " + encodedResource + " - check your import definitions!");