page contents

Dubbo源码SPI中的获取配置文件classLoader.getResources与 ClassLoader.getSystemResources方法

Pack 发布于 2020-01-06 16:48
阅读 968
收藏 0
分类:Java开发

如题,我在阅读Dubbo加载扩展点资源文件源码时,看到这么一段代码:


private void loadDirectory(Map<String, Class<?>> extensionClasses, String dir, String type) {

        String fileName = dir + type;

        try {

            Enumeration<java.net.URL> urls;

            ClassLoader classLoader = findClassLoader();

            if (classLoader != null) {

                urls = classLoader.getResources(fileName);

            } else {

                urls = ClassLoader.getSystemResources(fileName);

            }

            if (urls != null) {

                while (urls.hasMoreElements()) {

                    java.net.URL resourceURL = urls.nextElement();

                    loadResource(extensionClasses, classLoader, resourceURL);

                }

            }

        } catch (Throwable t) {

            logger.error("Exception occurred when loading extension class (interface: " +

                    type + ", description file: " + fileName + ").", t);

        }

    }


以上代码出自类ExtensionLoader中,我看到dubbo在加载时为了获取配置文件资源路径调用了两次两个不同的方法getResources()与getSystemResources();


这两个方法我百度得知前者只能在jvm启动环境下获得路径下文件,而后者不仅jvm连tomcat启动环境也可以获得资源文件。


我的问题是:dubbo考虑的是挺全面的,但是直接用后者不就已经涵盖两种情况了吗,为什么还要多加一个判断?

119
Pack
Pack

这个应该是加载机制有关,你看如果没有获取到ExtensionClassLoader,else里执行的直接就是用ClassLoader来执行,也就是用顶级加载器,BootstrapClassLoader

请先 登录 后评论