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();
}
}
- spring扫描注解工具类scan
- Spring配置文件中component-scan 扫描指定的包中的类上常用的注解
- 关于context:component-scan扫描spring注解标记的用法
- Spring源码研究之注解扫描<context:component-scan/>
- ARP扫描工具arp-scan
- spring component-scan 包扫描
- Spring开启注解<context:annotation-config />和扫描:<context:component-scan />解释
- spring自动扫描java类(context:component-scan)
- spring启动component-scan类扫描加载过程---源码分析
- spring启动component-scan类扫描加载过程---源码分析
- spring启动component-scan类扫描加载过程---源码分析
- spring启动component-scan类扫描加载过程---源码分析
- spring启动component-scan类扫描加载过程---源码分析
- spring启动component-scan类扫描加载过程
- <context:component-scan>扫描@Component @Controller@Service注解的的类 <mvc:annotation-driven />启用注解
- Spring 2.5 注解 Component-scan
- 启动类扫描的注解解析器 <context:component-scan base-package="com.tfy.oa"></context:component-scan>
- 综合扫描工具x-scan使用教程
- 黑马程序员——013——JavaAPI⑤(集合框架(Map)、Collections)
- 关于volley javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: 错误
- 楼教主的final总结----2009年ACM-ICPC——瑞典取双
- 002三大类库02_Collection
- JDBC:execute(),executeQuery()和executeUpdate()的用法与区别
- spring扫描注解工具类scan
- NSTimer知识点和倒计时的实现
- mac 下对apk进行重新签名
- 欢迎使用CSDN-markdown编辑器
- mysql查看正在执行的sql语句
- 黑马程序员—IOS加强视频—@Class
- PreparedStatement
- 博客第一天。
- exchange2013导入证书后显示无效的问题