为什么在XmlBeanDefinitionReader中使用ThreadLocal

时间:2019-05-24 03:33:07

标签: spring

我正在阅读spring源代码。当我读XmlBeanDefinitionReader.java时,我不明白为什么在那儿使用ThreadLocal。在某些情况下,也许同一线程多次调用此方法?

有人可以向我解释吗?

谢谢。

代码片段:

public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
    // ...

    // why use ThreadLocal there?
    private final ThreadLocal<Set<EncodedResource>> resourcesCurrentlyBeingLoaded =
            new NamedThreadLocal<Set<EncodedResource>>("XML bean definition resources currently being loaded");

    // load spring beanDefinition
    public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
        Assert.notNull(encodedResource, "EncodedResource must not be null");
        if (logger.isInfoEnabled()) {
            logger.info("Loading XML bean definitions from " + encodedResource.getResource());
        }

        // There 
        Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();
        if (currentResources == null) {
            currentResources = new HashSet<EncodedResource>(4);
            this.resourcesCurrentlyBeingLoaded.set(currentResources);
        }
        if (!currentResources.add(encodedResource)) {
            throw new BeanDefinitionStoreException(
                    "Detected cyclic loading of " + encodedResource + " - check your import definitions!");
        }
        try {
            // load file...
        }
        catch (IOException ex) {
            throw new BeanDefinitionStoreException(
                    "IOException parsing XML document from " + encodedResource.getResource(), ex);
        }
        finally {
            currentResources.remove(encodedResource);
            if (currentResources.isEmpty()) {
                this.resourcesCurrentlyBeingLoaded.remove();
            }
        }
    }

    // ...
}

0 个答案:

没有答案