spring扫描annotation

来源:互联网 发布:mac菜单栏显示器图标 编辑:程序博客网 时间:2024/05/21 07:49
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;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.core.io.Resource;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.core.io.support.ResourcePatternResolver;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.ClassUtils;/** * 扫描包中的类 */public class LoadPackageClasses {    private static final String RESOURCE_PATTERN = "/**/*.class";    private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();     private List<String> packagesList = new LinkedList<String>();    private List<TypeFilter> typeFilters = new LinkedList<TypeFilter>();        private Set<Class<?>> classSet = new HashSet<Class<?>>();    /**     *eg: <pre name="code" class="java">     *   String[] cs = new String[1];     *   cs[0] = "com.wz.test";     *   LoadPackageClasses l = new LoadPackageClasses(cs,     *           org.springframework.stereotype.Controller.class);     * l.getClassSet();     */    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));            }        }   }    public Set<Class<?>> getClassSet() throws IOException, 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));                        }                    }                }            }        }        return this.classSet;    }    /**     * 检查注解     */    private boolean matchesEntityTypeFilter(MetadataReader reader, MetadataReaderFactory readerFactory) throws IOException {        if (!this.typeFilters.isEmpty()) {            for (TypeFilter filter : this.typeFilters) {                if (filter.match(reader, readerFactory)) {                    return true;                }            }        }        return false;    }}


0 0
原创粉丝点击