如何裸写或者利用Spring扫描出指定包下的所有类名
在很多Java框架中都有组件扫描功能,即给出一个注解,框架能够把所有标注了此注解的类找出来。这种操作的本质是给出一个名包,能获取到此包下的所有类名,而后再通过反射判断能否加了指定的注解。无论是什么框架,包括Spring, 完成这个功能底层都是用的ClassLoader.getResources()
或者ClassLoader.getSystemResources()
方法实现的,即先找出指定classpath下的”资源”,可能是文件也可能是jar包,而后通过文件I/O读取jar, 把每一个.class
文件名一律列出就可。假如我们要自己手写这样的功能的话就必需参照这个思路去实现,但是逻辑比较复杂,主要是很多细节问题需要注意。这里有一个我自己实现的PkgScanner
可供参考,github: wanghongfei/pkg-scanner
当然,多数时候我们并不想自己重复造轮子。Spring就有现成的类可以让我们直接使用, 它们分别是ResourcePatternResolver
和CachingMetadataReaderFactory
,使用方法如下:
public class ScanTest extends BaseTestClass implements ResourceLoaderAware { /** * Spring容器注入 */ private ResourceLoader resourceLoader; @Test public void test() throws IOException { ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader); MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resourceLoader); Resource[] resources = resolver.getResources("classpath*:your/package/name/**/*.class"); for (Resource r : resources) { MetadataReader reader = metaReader.getMetadataReader(r); System.out.println(reader.getClassMetadata().getClassName()); } } @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; }}
在我的项目里,这个单测的输出是:
output
可见已经完全满足了要求。
假如去深究源码实现,最终你会在PathMatchingResourcePatternResolver
类的doFindAllClassPathResources()
方法中找到答案:
code
即,本质还是扫描jar包,读取jar包。
其实这个功能最好直接集成到JDK的类库中,这样大家就不必绕这么大圈子来实现这个看似简单但逻辑又非常复杂的功能了。
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 如何裸写或者利用Spring扫描出指定包下的所有类名
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 如何裸写或者利用Spring扫描出指定包下的所有类名