--------------------------------------------------------------------------------该工具类主要是用于自定义扫描包---------------------------------------------------------------------------
首先需要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();
}
}