java 注解 扫描_JAVA 注解扫描

packagecn.com.hithere.web.listener;importjava.io.IOException;importjava.lang.annotation.Annotation;importjava.util.HashSet;importjava.util.LinkedList;importjava.util.List;importjava.util.Set;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importorg.springframework.core.io.Resource;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importorg.springframework.core.io.support.ResourcePatternResolver;importorg.springframework.core.type.classreading.CachingMetadataReaderFactory;importorg.springframework.core.type.classreading.MetadataReader;importorg.springframework.core.type.classreading.MetadataReaderFactory;importorg.springframework.core.type.filter.AnnotationTypeFilter;importorg.springframework.core.type.filter.TypeFilter;importorg.springframework.util.ClassUtils;public classLoadPackageClasses {protected final Log logger =LogFactory.getLog(getClass());private static final String RESOURCE_PATTERN = "/**/*.class";private ResourcePatternResolver resourcePatternResolver = newPathMatchingResourcePatternResolver();private List packagesList= new LinkedList();private List typeFilters = new LinkedList();private Set> classSet= new HashSet>();/*** 构造函数

*@parampackagesToScan 指定哪些包需要被扫描,支持多个包"package.a,package.b"并对每个包都会递归搜索

*@paramannotationFilter 指定扫描包中含有特定注解标记的bean,支持多个注解*/

public LoadPackageClasses(String[] packagesToScan, Class extends Annotation>... annotationFilter){if (packagesToScan != null) {for(String packagePath : packagesToScan) {this.packagesList.add(packagePath);

}

}if (annotationFilter != null){for (Class extends Annotation>annotation : annotationFilter) {

typeFilters.add(new AnnotationTypeFilter(annotation, false));

}

}

}/*** 将符合条件的Bean以Class集合的形式返回

*@return*@throwsIOException

*@throwsClassNotFoundException*/

public Set> getClassSet() throwsIOException, ClassNotFoundException {this.classSet.clear();if (!this.packagesList.isEmpty()) {for (String pkg : this.packagesList) {

String pattern= ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +ClassUtils.convertClassNameToResourcePath(pkg)+RESOURCE_PATTERN;

Resource[] resources= this.resourcePatternResolver.getResources(pattern);

MetadataReaderFactory readerFactory= new CachingMetadataReaderFactory(this.resourcePatternResolver);for(Resource resource : resources) {if(resource.isReadable()) {

MetadataReader reader=readerFactory.getMetadataReader(resource);

String className=reader.getClassMetadata().getClassName();if(matchesEntityTypeFilter(reader, readerFactory)) {this.classSet.add(Class.forName(className));

}

}

}

}

}//输出日志

if(logger.isInfoEnabled()){for (Class> clazz : this.classSet) {

logger.info(String.format("Found class:%s", clazz.getName()));

}

}return this.classSet;

}/*** 检查当前扫描到的Bean含有任何一个指定的注解标记

*@paramreader

*@paramreaderFactory

*@return*@throwsIOException*/

private boolean matchesEntityTypeFilter(MetadataReader reader, MetadataReaderFactory readerFactory) throwsIOException {if (!this.typeFilters.isEmpty()) {for (TypeFilter filter : this.typeFilters) {if(filter.match(reader, readerFactory)) {return true;

}

}

}return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值