Spring注解(二)——AnnotationFilter

注解过滤器

  • 核心属性
  • 核心方法
    • 默认方法
    • 接口方法
    • 静态方法
  • PackagesAnnotationFilter
    • 核心属性
    • 构造器
    • matches

这个是一个注解过滤器接口,用来匹配指定注解是否属于指定包下的 PLAIN 、JAVA,匹配任何注解 ALL,不匹配任何注解 NONE

核心属性

过滤指定的注解类型。PLAIN 、JAVA赋值依赖于静态packages方法

	/**
	* 过滤器匹配java.lang包和spring的lang包下的注解
	*/
	AnnotationFilter PLAIN = packages("java.lang", "org.springframework.lang");

	/**
	 * 过滤器匹配JDK的核心注解
	 */
	AnnotationFilter JAVA = packages("java", "javax");

	/**
	 * 所有匹配一律返回true
	 */
	AnnotationFilter ALL = new AnnotationFilter() {
		@Override
		public boolean matches(Annotation annotation) {
			return true;
		}
		@Override
		public boolean matches(Class<?> type) {
			return true;
		}
		@Override
		public boolean matches(String typeName) {
			return true;
		}
		@Override
		public String toString() {
			return "All annotations filtered";
		}
	};

	/**
	 *任何匹配注解都返回false
	 */
	@Deprecated
	AnnotationFilter NONE = new AnnotationFilter() {
		@Override
		public boolean matches(Annotation annotation) {
			return false;
		}
		@Override
		public boolean matches(Class<?> type) {
			return false;
		}
		@Override
		public boolean matches(String typeName) {
			return false;
		}
		@Override
		public String toString() {
			return "No annotation filtering";
		}
	};

核心方法

默认方法

//判断指定注解是否匹配过滤器
default boolean matches(Annotation annotation) {
		return matches(annotation.annotationType());
	}
//判断指定注解类型是否匹配
default boolean matches(Class<?> type) {
		return matches(type.getName());
	}	

接口方法

//传入类型名称,其实也就是全类名
boolean matches(String typeName);

静态方法

这是一个核心方法,PLAIN、JAVA这两个过滤器都需要通过它来构建。所以只要jvm加载AnnotationFilter,就会调用这个方法来给过滤器常量赋值。这样做就可以保证生成过滤器规则一致。

static AnnotationFilter packages(String... packages) {
//只能通过接口访问该方法。
		return new PackagesAnnotationFilter(packages);
	}

PackagesAnnotationFilter

作为AnnotationFilter的实现,定义为final禁止继承

核心属性

//前缀数组
private final String[] prefixes;
//hashCode
private final int hashCode;

构造器

包路径注解过滤器。把路径遍历,每一个加.之后放入前缀数组,再排个序。调用:

AnnotationFilter.packages(“com.xxx.xx”)
走了AnnotationFilter 的静态方法packages构建了包路径过滤器

PackagesAnnotationFilter(String... packages) {
		Assert.notNull(packages, "Packages array must not be null");
		this.prefixes = new String[packages.length];
		for (int i = 0; i < packages.length; i++) {
			String pkg = packages[i];
			Assert.hasText(pkg, "Packages array must not have empty elements");
			this.prefixes[i] = pkg + ".";
		}
		Arrays.sort(this.prefixes);
		this.hashCode = Arrays.hashCode(this.prefixes);
	}

matches

传入注解类型,全类名,然后和前缀比较是否匹配

	@Override
	public boolean matches(String annotationType) {
		for (String prefix : this.prefixes) {
			if (annotationType.startsWith(prefix)) {
				return true;
			}
		}
		return false;
	}

你可能感兴趣的:(Spring,spring)