spring 扫描包 不起作用

问题

spring中配置了包路径,但不扫描包,上网搜索后发现,eclipse导出包时勾选add directory entry就ok了。我的疑问是add directory entry作用是什么?spring扫包是什么原理,怎么会跟add directory entry有关系?

add directory entry作用

我们先来看一下add directory entry的作用。

工程目录
spring 扫描包 不起作用_第1张图片

eclipse 导出包 勾选 add directory entry
spring 扫描包 不起作用_第2张图片

eclipse 导出包 不勾选 add directory entry
spring 扫描包 不起作用_第3张图片

使用jar命令查看不同
spring 扫描包 不起作用_第4张图片

可以清晰的看到,添加了directory entry 的有文件夹信息;没有添加directory entry的没有文件夹信息。

spring扫包原理

ContextNamespaceHandler入手跟踪spring源码获知,spring通过Classloader.getResources(String path)获取资源

PathMatchingResourcePatternResolver.java

protected Set<Resource> doFindAllClassPathResources(String path) throws IOException {
        Set<Resource> result = new LinkedHashSet<Resource>(16);
        ClassLoader cl = getClassLoader();
        //使用java.lang.ClassLoader获取资源
        Enumeration<URL> resourceUrls = (cl != null ? cl.getResources(path) : ClassLoader.getSystemResources(path));
        while (resourceUrls.hasMoreElements()) {
            URL url = resourceUrls.nextElement();
            result.add(convertClassLoaderURL(url));
        }
        if ("".equals(path)) {
            // The above result is likely to be incomplete, i.e. only containing file system references.
            // We need to have pointers to each of the jar files on the classpath as well...
            addAllClassLoaderJarRoots(cl, result);
        }
        return result;
    }

这里模拟spring获取包代码,将导出的包加入到另外一个工程类路径下,获取包信息;添加没有文件夹信息的包后,url始终为空!添加有文件夹信息的包后,就可以获取到包资源了。

spring 扫描包 不起作用_第5张图片

URL url = TestDirectoryEntry.class.getClassLoader().getResource("a");
System.out.println(url);

总结

add directory entry,jar包包含文件夹信息,可以根据包名获取资源信息;

你可能感兴趣的:(spring,eclipse,javase)