Spring注解(二)——AnnotationFilter


这个是一个注解过滤器接口,用来匹配指定注解是否属于指定包下的 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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值