Spring根据包名获取包路径下的所有类
参考mybatis MapperScannerConfigurer.java
最终找到 Spring的一个类 ClassPathBeanDefinitionScanner.java
参考ClassPathBeanDefinitionScanner 和它的父类 ClassPathScanningCandidateComponentProvider,将一些代码进行抽取,得到如下工具类。
import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternUtils; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.TypeFilter; import org.springframework.util.StringUtils; import org.springframework.util.SystemPropertyUtils;import java.io.IOException; import java.lang.annotation.Annotation; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set;public class ClassScaner implements ResourceLoaderAware {//保存过滤规则要排除的注解private final List<TypeFilter> includeFilters = new LinkedList<TypeFilter>();private final List<TypeFilter> excludeFilters = new LinkedList<TypeFilter>();private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver);public static Set<Class> scan(String[] basePackages,Class<? extends Annotation>... annotations) {ClassScaner cs = new ClassScaner();if(ArrayUtils.isNotEmpty(annotations)) {for (Class anno : annotations) {cs.addIncludeFilter(new AnnotationTypeFilter(anno));}}Set<Class> classes = new HashSet<Class>();for (String s : basePackages)classes.addAll(cs.doScan(s));return classes;}public static Set<Class> scan(String basePackages, Class<? extends Annotation>... annotations) {return ClassScaner.scan(StringUtils.tokenizeToStringArray(basePackages, ",; \t\n"), annotations);}public final ResourceLoader getResourceLoader() {return this.resourcePatternResolver;}public void setResourceLoader(ResourceLoader resourceLoader) {this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);}public void addIncludeFilter(TypeFilter includeFilter) {this.includeFilters.add(includeFilter);}public void addExcludeFilter(TypeFilter excludeFilter) {this.excludeFilters.add(0, excludeFilter);}public void resetFilters(boolean useDefaultFilters) {this.includeFilters.clear();this.excludeFilters.clear();}public Set<Class> doScan(String basePackage) {Set<Class> classes = new HashSet<Class>();try {String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ org.springframework.util.ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage))+ "/**/*.class";Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);for (int i = 0; i < resources.length; i++) {Resource resource = resources[i];if (resource.isReadable()) {MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource);if ((includeFilters.size() == 0 && excludeFilters.size() == 0)|| matches(metadataReader)) {try {classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));} catch (ClassNotFoundException e) {e.printStackTrace();}}}}} catch (IOException ex) {throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);}return classes;}protected boolean matches(MetadataReader metadataReader) throws IOException {for (TypeFilter tf : this.excludeFilters) {if (tf.match(metadataReader, this.metadataReaderFactory)) {return false;}}for (TypeFilter tf : this.includeFilters) {if (tf.match(metadataReader, this.metadataReaderFactory)) {return true;}}return false;}public static void main(String[] args) {ClassScaner.scan("com.hjzgg.test.thirdjar.config,com.hjzgg.test.thirdjar.web", null).forEach(clazz -> System.out.println(clazz));} }
转载于:https://www.cnblogs.com/hujunzheng/p/7284280.html
Spring根据包名获取包路径下的所有类相关推荐
- Go 语言同一个包内函数调用、包名和实际路径最后一个目录不一致问题
以下代码的 GOPATH 路径为 "/home/wohu/GoCode" 1. 同一个包内的函数可以相互调用 代码结构如下: wohu@wohu:~/GoCode/src$ tre ...
- C#中获取指定路径下特定开头和后缀的所有文件
场景 指定一个文件路径,获取当前路径下所有文件,并筛选出以指定内容开头和结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 ...
- JAVA获取同一路径下所有子类或接口实现类
2019独角兽企业重金招聘Python工程师标准>>> 整个测试代码如下: Java代码 package find; import java.io.File; import ja ...
- 通过输入ab包名和后缀名自动添加或修改ab包名(同一文件夹下的所有文夹都会被修改包括子文件夹)
说明 temp = temp.Substring(temp.IndexOf("Assets")); 这段代码主要是获取的文件路径为完整路径,而AssetImporter.GetAt ...
- 【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 )
文章目录 一.Android 应用的默认安装目录 二.查找 Android 应用的安装目录 1.查询当前正在运行的应用包名 2.根据包名查询应用安装路径 一.Android 应用的默认安装目录 应用安 ...
- java解析xml文件练习——通过应用包名获取应用图标即其他信息(基于魅族应用商店)...
1.解析包名数据文件(txt文件),并生成包名数组: package jsouphtml;import java.io.BufferedReader; import java.io.File; imp ...
- Java包名与包路径
很多初学者以为只要把生成的class文件放在某个目录下,这个目录名就成了这个类的包名.这是一个错误的看法,不是有了目录 结构,就等于有了包名.为Java类添加包必须在Java源文件中通过 packag ...
- C#中获取指定路径下指定后缀名的所有文件的路径的list
场景 指定一个路径和后缀名,查找这个路径下所有以此后缀名结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获 ...
- 使用最新的python代码发送nbns协议包,获取同一局域网下其它电脑的名称
可以使用python的socket库发送NBNS协议包来获取局域网内其他计算机的名称.下面是示例代码: importsocketdef get_host_by_name(name):addr = so ...
最新文章
- 关于Linux的一些个人研习感悟
- 【NLP】如何在文本分类任务中Fine-Tune BERT
- 《迷宫》之站立会议—5.15
- ospf 环回口的路由条目_路由策略之重分发示例分析
- MongoDB入门 - 安装教程
- 常用系统级加压工具简介
- Jquery根据JSON生成Table
- linux文件恢复dbf,linux平台下数据文件被误删后,如何及时得知并进行恢复-dbf文件怎么打开...
- poj2488-A Knight's Journey【DFS】
- JWT-JSON WEB TOKEN使用详解及注意事项
- 密码学系列之二:密码学基本概念
- 知识图谱关系抽取 python_知识图谱关系抽取
- 目前最好的DirectShow分离器和解码器: LAV Filter
- LaTeX算法流程中英文伪代码
- 【Windows】实现微信双开或多开
- 利用XML制作UGUI登陆界面
- 【每日早报】2019/08/08
- repr函数输出调试信息
- 杭州云栖·2050大会-团聚召集人手册
- 在线学生计算机,计算机学生顶岗实习计划(网络版)
热门文章
- linux死锁的例子,操作系统教程—Linux实例分析 孟庆昌 第8章 死锁new.ppt
- python期中考试知识点_大学期末考试,有哪些高效复习的技巧?
- rageframe2 数据库配置_RF 微商城 一款基于 RageFrame2 的免费开源的基础销售功能的微商城...
- 数学建模亚太赛优秀论文_2019亚太地区大学生数学建模竞赛志愿者等级评定结果公布!...
- Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...
- windows如何生成ssh密钥
- decimal转为string sql_PHP+Mysql防止SQL注入的方法
- java没有这样的元素异常_java – 没有这样的元素异常?
- BugkuCTF-Reverse题mobile1(gctf)
- 设置maven 参数调休_IDEA 使用 Maven构建Spark项目