`
wangzl2222
  • 浏览: 148185 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Spring 获取一个包和子包下面所有的类

阅读更多

from:http://www.iteye.com/topic/203267

 

参考spring2.5里面的component-scan功能,提炼出这样一个工具类,此类依赖spring但不依赖spring容器,请注意此类搜索不到jdk的包如java.lang

Java代码 复制代码
  1.   
  2. import java.io.IOException;   
  3. import java.lang.annotation.Annotation;   
  4. import java.util.HashSet;   
  5. import java.util.LinkedList;   
  6. import java.util.List;   
  7. import java.util.Set;   
  8.   
  9. import org.springframework.beans.factory.BeanDefinitionStoreException;   
  10. import org.springframework.context.ResourceLoaderAware;   
  11. import org.springframework.core.io.Resource;   
  12. import org.springframework.core.io.ResourceLoader;   
  13. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;   
  14. import org.springframework.core.io.support.ResourcePatternResolver;   
  15. import org.springframework.core.io.support.ResourcePatternUtils;   
  16. import org.springframework.core.type.classreading.CachingMetadataReaderFactory;   
  17. import org.springframework.core.type.classreading.MetadataReader;   
  18. import org.springframework.core.type.classreading.MetadataReaderFactory;   
  19. import org.springframework.core.type.filter.AnnotationTypeFilter;   
  20. import org.springframework.core.type.filter.TypeFilter;   
  21. import org.springframework.util.SystemPropertyUtils;   
  22.   
  23. public class ClassScaner implements ResourceLoaderAware {   
  24.   
  25.     private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();   
  26.   
  27.     private final List<TypeFilter> includeFilters = new LinkedList<TypeFilter>();   
  28.   
  29.     private final List<TypeFilter> excludeFilters = new LinkedList<TypeFilter>();   
  30.   
  31.     private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(   
  32.             this.resourcePatternResolver);   
  33.   
  34.     public ClassScaner() {   
  35.   
  36.     }   
  37.   
  38.     public void setResourceLoader(ResourceLoader resourceLoader) {   
  39.         this.resourcePatternResolver = ResourcePatternUtils   
  40.                 .getResourcePatternResolver(resourceLoader);   
  41.         this.metadataReaderFactory = new CachingMetadataReaderFactory(   
  42.                 resourceLoader);   
  43.     }   
  44.   
  45.     public final ResourceLoader getResourceLoader() {   
  46.         return this.resourcePatternResolver;   
  47.     }   
  48.   
  49.     public void addIncludeFilter(TypeFilter includeFilter) {   
  50.         this.includeFilters.add(includeFilter);   
  51.     }   
  52.   
  53.     public void addExcludeFilter(TypeFilter excludeFilter) {   
  54.         this.excludeFilters.add(0, excludeFilter);   
  55.     }   
  56.   
  57.     public void resetFilters(boolean useDefaultFilters) {   
  58.         this.includeFilters.clear();   
  59.         this.excludeFilters.clear();   
  60.     }   
  61.   
  62.     public static Set<Class> scan(String basePackage,   
  63.             Class<? extends Annotation>... annotations) {   
  64.         ClassScaner cs = new ClassScaner();   
  65.         for (Class anno : annotations)   
  66.             cs.addIncludeFilter(new AnnotationTypeFilter(anno));   
  67.         return cs.doScan(basePackage);   
  68.     }   
  69.   
  70.     public static Set<Class> scan(String[] basePackages,   
  71.             Class<? extends Annotation>... annotations) {   
  72.         ClassScaner cs = new ClassScaner();   
  73.         for (Class anno : annotations)   
  74.             cs.addIncludeFilter(new AnnotationTypeFilter(anno));   
  75.         Set<Class> classes = new HashSet<Class>();   
  76.         for (String s : basePackages)   
  77.             classes.addAll(cs.doScan(s));   
  78.         return classes;   
  79.     }   
  80.   
  81.     public Set<Class> doScan(String basePackage) {   
  82.         Set<Class> classes = new HashSet<Class>();   
  83.         try {   
  84.             String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX   
  85.                     + org.springframework.util.ClassUtils   
  86.                             .convertClassNameToResourcePath(SystemPropertyUtils   
  87.                                     .resolvePlaceholders(basePackage))   
  88.                     + "/**/*.class";   
  89.             Resource[] resources = this.resourcePatternResolver   
  90.                     .getResources(packageSearchPath);   
  91.   
  92.             for (int i = 0; i < resources.length; i++) {   
  93.                 Resource resource = resources[i];   
  94.                 if (resource.isReadable()) {   
  95.                     MetadataReader metadataReader = this.metadataReaderFactory   
  96.                             .getMetadataReader(resource);   
  97.                     if ((includeFilters.size() == 0 && excludeFilters.size() == 0)   
  98.                             || matches(metadataReader)) {   
  99.                         try {   
  100.                             classes.add(Class.forName(metadataReader   
  101.                                     .getClassMetadata().getClassName()));   
  102.                         } catch (ClassNotFoundException e) {   
  103.                             e.printStackTrace();   
  104.                         }   
  105.   
  106.                     }   
  107.                 }   
  108.             }   
  109.         } catch (IOException ex) {   
  110.             throw new BeanDefinitionStoreException(   
  111.                     "I/O failure during classpath scanning", ex);   
  112.         }   
  113.         return classes;   
  114.     }   
  115.   
  116.     protected boolean matches(MetadataReader metadataReader) throws IOException {   
  117.         for (TypeFilter tf : this.excludeFilters) {   
  118.             if (tf.match(metadataReader, this.metadataReaderFactory)) {   
  119.                 return false;   
  120.             }   
  121.         }   
  122.         for (TypeFilter tf : this.includeFilters) {   
  123.             if (tf.match(metadataReader, this.metadataReaderFactory)) {   
  124.                 return true;   
  125.             }   
  126.         }   
  127.         return false;   
  128.     }   
  129.   
  130. }  
分享到:
评论

相关推荐

    springCloud

    1) 服务的注册与发现 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    java微信公众号MVC开发框架

    WeixinConfigurer是唯一需要配置的部分,packages属性必须配置,里面是微信控制器包路径列表,WeixinDispatcherServlet在启动阶段会扫描包路径及其下面的子包路径,如果类拥有@Weixin注解,则该类会被当作微信控制器...

    java面试宝典

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    千方百计笔试题大全

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

    DWR.xml配置文件说明书(含源码)

    要想允许转换指定包或子包下所有类的转换可以按照下面的设置 *"/&gt; 很明显,可以采用下面的方式来转换所有的java bean *"/&gt; 2.3 Restricting Property Conversion(指定属性转换) 将象用exclude和incluce来通知DWR隔离...

    乐优商城.xmind

    gateway网关中编写一个配置类 GlobalCorsConfig 添加CORS配置信息 允许的域,不要写*,否则cookie就无法使用了 是否发送Cookie信息 允许的请求方式 允许的头信息 有效时长 添加映射路径,我们拦截一切请求 ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    这些都预示着我们进入了一个新的互联网阶段web 2.0,它是相对web 1.0的新的一类互联网应用的总称,是一次从核心内容到外部应用的革命[10]。这个阶段发展迅速,互联网应用趋于多样化,其中变化最大的是由web 1.0网站...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

    J2EE面试题

    11) 编写自定义标签处理类后,需要编写一个()去描述。 a) .tag 文件 b) .tld 文件 c) .dtd文件 d) .xml 文件 12) 关于Tag File说法不正确的是()。 a) Tag File是JSP2.0新增的功能 b) Tag File是JSP...

    freemarker总结

    有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"/${data}"year""}屏幕输出结果为:/${data}"year" 转义 含义 ...

    ibatis 开发指南(pdf)

    创建测试数据库,并在数据库中创建一个t_user 表,其中包含三个字段: . id(int) . name(varchar) . sex(int) 。 3. 为了在开发过程更加直观,我们需要将ibatis 日志打开以便观察ibatis 运作的细节...

Global site tag (gtag.js) - Google Analytics