`
wangzl2222
  • 浏览: 151487 次
  • 性别: 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. }  
分享到:
评论

相关推荐

    spring的全部jar包

    6. **Spring Boot**: 这是Spring的一个子项目,它简化了创建独立的、生产级别的基于Spring的应用程序。Spring Boot通过默认配置、嵌入式服务器、starter POMs等方式,极大地加快了开发过程。 7. **Spring Security*...

    springCloud

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

    spring boot文件夹文件监听程序

    Spring Boot项目可以利用Java的`java.nio.file.FileSystems`和`java.nio.file.Path`类来创建一个观察者,监听指定目录的变化。当文件或目录被创建、删除或修改时,观察者会触发回调事件。 1. **创建文件监听器:** ...

    全注解 spring boot +spring security + mybatis+druid+thymeleaf+mysql+bootstrap

    **Spring Security** 是Spring框架的一个子项目,专注于提供身份验证和授权功能。它可以保护你的应用程序免受恶意访问,支持各种认证和授权机制,包括HTTP基本认证、OAuth2、JWT等。 **MyBatis** 是一个优秀的持久...

    maven+hibernate+spring+springmvc

    结合这四个技术,我们可以构建出一个高效的Java Web应用程序:Maven管理项目的构建和依赖,Hibernate负责数据持久化,Spring提供上下文和依赖注入,以及AOP和ORM支持,而Spring MVC则处理Web层面的请求响应。...

    spring oauth2获取当前登录用户信息.docx

    在Spring OAuth2框架中,获取当前登录用户信息的过程与Spring Security有所不同。通常,Spring Security允许我们通过`SecurityContextHolder.getContext().getAuthentication().getPrincipal()`来获取详细的用户信息...

    spring4注解

    这个标签会扫描指定的基础包及其子包中的所有类,并自动将这些类作为Spring管理的bean。 ##### 4.2 扫描策略 - **基础包**: 使用`base-package`属性指定需要扫描的类包,该包及其所有子包中的类都将被处理。 - **...

    beam spring boot cloud的架子,包含mybatisplus redis等组件,能够开发接口、定时等 不包含权

    1. **Spring Boot**: Spring Boot是Spring框架的一个子项目,它简化了Spring应用程序的初始设置和配置。通过内置的Tomcat服务器、自动配置和起步依赖,Spring Boot使得开发独立的、生产级别的Java应用变得更加容易。...

    spring-batch-reference

    《Spring Batch参考指南》是Spring框架的一个重要组成部分,专注于批量处理和大数据量操作。Spring Batch为开发者提供了一套全面的框架,用于构建可扩展、高效且健壮的批处理应用程序。下面将详细介绍Spring Batch的...

    Springboot+SpringCloud微服务架构demo

    在本项目中,"Springboot+SpringCloud微服务架构demo"是基于Spring Boot 2.2.2.RELEASE和Spring Cloud Hoxton.SR1构建的一个基础微服务示例,旨在帮助初学者理解和掌握Spring Cloud的相关概念和技术。下面将详细阐述...

    spring课件汇总

    9. **Spring Data**: 一个用于简化数据访问的模块,支持NoSQL数据库和传统的关系型数据库。它提供了一种声明式的方式来进行CRUD操作,简化了与数据库的交互。 10. **Spring Cloud**: 在微服务架构中,Spring Cloud...

    Spring-JDBC整合-MySQL8、java8版本

    以上配置表明,所有在com.example.service包及其子包下的方法都将被包含在默认的REQUIRED事务传播规则中。 总的来说,Spring JDBC为Java开发者提供了一种简洁、高效的方式来处理数据库操作,结合MySQL8和Java 8,...

    Spring官网下载各版本jar包的方法

    Spring是一个广泛使用的Java框架,它提供了一个灵活的架构来开发企业级应用程序。为了使用Spring框架,需要下载相应的jar包。Spring官网提供了多版本的jar包下载,但是下载过程却不太明确。下面将详细介绍Spring...

    Spring ioc源码解读

    - **DefaultListableBeanFactory**:这是BeanFactory的一个具体实现类,它继承自AbstractBeanFactory,提供了对Bean定义的存储和解析等功能。同时它也是ListableBeanFactory的实现,可以提供Bean的列表视图。 - **...

    springcloud整合openfeign完整代码

    在Spring Cloud生态系统中,OpenFeign是一个非常重要的组件,它实现了声明式的Web服务客户端,使得开发者可以更加方便地调用微服务之间的接口。本项目整合了Spring Cloud OpenFeign,并结合了其他关键组件如Nacos...

    Spring Security集成CAS客户端实例

    这个实例提供了一个基础的SSO解决方案,帮助开发者理解Spring Security和CAS的集成机制,并在此基础上进行扩展。 总之,Spring Security和CAS的结合使得企业级应用能够实现高效且安全的单点登录,减少了用户认证的...

    Maven模块项目。整合spring+springmvc+mybatis

    "Maven模块项目"就是这样一个示例,它演示了如何利用Maven的模块化特性,结合Spring、SpringMVC和MyBatis这三大流行Java Web开发框架进行项目整合。下面将详细介绍这些知识点。 首先,Maven是Apache软件基金会开发...

    spring batch指南

    Spring Batch是Spring生态体系中的一个核心组件,专为处理大量数据而设计,它提供了丰富的功能和高度可配置性,适用于各种批处理场景。下面将详细阐述Spring Batch的主要知识点。 一、Spring Batch基本概念 1. **...

    mybatis3与Spring整合官方中文版.pdf

    `SqlSessionSupport`是另一个辅助类,它本身不是一个`SqlSession`,但可以获取到`SqlSession`实例来进行数据库操作。 #### 六、注入映射器 **6.1 MapperFactoryBean** `MapperFactoryBean`用于将映射器接口注入到...

    Spring2.5_注解介绍(3.0通用)

    - `&lt;context:component-scan&gt;`:这个命名空间元素用于开启组件扫描,Spring会搜索指定包及其子包中的类,寻找带有特定注解的bean定义。`base-package`属性指定了扫描的起始位置。 - `过滤器`:可以使用四种过滤...

Global site tag (gtag.js) - Google Analytics