spring扫描注解工具类scan

来源:互联网 发布:linux下编译c程序 编辑:程序博客网 时间:2024/05/28 18:44

--------------------------------------------------------------------------------该工具类主要是用于自定义扫描包---------------------------------------------------------------------------

首先需要spring的扫描工具类-----(废话少说直接贴代码)

package com.hengbao.framework.controller;
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.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.SystemPropertyUtils;  
public class ClassScaner implements ResourceLoaderAware {  
 
    private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();  
 
    private final List<TypeFilter> includeFilters = new LinkedList<TypeFilter>();  
 
    private final List<TypeFilter> excludeFilters = new LinkedList<TypeFilter>();  
 
    private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(  
            this.resourcePatternResolver);  
 
    public ClassScaner() {  
 
    }  
 
    public void setResourceLoader(ResourceLoader resourceLoader) {  
        this.resourcePatternResolver = ResourcePatternUtils  
                .getResourcePatternResolver(resourceLoader);  
        this.metadataReaderFactory = new CachingMetadataReaderFactory(  
                resourceLoader);  
    }  
 
    public final ResourceLoader getResourceLoader() {  
        return this.resourcePatternResolver;  
    }  
 
    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 static Set<Class> scan(String basePackage,  
            Class<? extends Annotation>... annotations) {  
        ClassScaner cs = new ClassScaner();  
        for (Class anno : annotations)  
            cs.addIncludeFilter(new AnnotationTypeFilter(anno));  
        return cs.doScan(basePackage);  
    }  
 
    public static Set<Class> scan(String[] basePackages,  
            Class<? extends Annotation>... annotations) {  
        ClassScaner cs = new ClassScaner();  
        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 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;  
    }  
 
}  
------------------------------------------------------上述类主要是递归扫描得到所有要扫描的java类------------------------------------------------------------

2.该类主要是用来获取注解的value值  当然通过1得到所有类你也可以自己手动注册到spring容器

package com.hengbao.framework.controller;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Set;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class AnnotationParsing implements ServletContextListener{
     public  void scanController() {
            Set<Class>  set = ClassScaner.scan("com.hengbao.sptsm.controller", org.springframework.stereotype.Controller.class);
            for(Class a:set){
                //获取类上的注解 a.getAnnotation(org.springframework.stereotype.Controller.class)
                System.out.println("*****************"+a);
            }
            try {
                Method methods[] = com.hengbao.sptsm.controller.ApplicationController.class.getMethods();
                
                for (Method method : methods) {
                    Annotation annotation = method.getAnnotation(org.apache.shiro.authz.annotation.RequiresPermissions.class);
                    if(annotation==null){
                        continue;
                    }else{
                        
                        System.out.println(method.getName()+" requestMapping注解 "+method.getAnnotation(org.springframework.web.bind.annotation.RequestMapping.class).value()[0]);
                        System.out.println(method.getName()+" permission注解 "+method.getAnnotation(org.apache.shiro.authz.annotation.RequiresPermissions.class).value()[0]);
                    }
                }
            } catch (SecurityException  e) {
                e.printStackTrace();
            }
        }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        new Thread(){
            @Override
            public void run() {
                scanController();
            }
        }.start();
        
    }
}


0 0
原创粉丝点击