1.目录结构:

2.pom文件:

Simple exmple:

package com.yuan.simple;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME)
public @interface Haha { String name() default "Haha lala";
}

 

package com.yuan.simple;

@Haha
public class Test { public static void show(Class c){
System.out.println(c.getName()); boolean isExist=c.isAnnotationPresent(Haha.class); if(isExist){
Haha haha=(Haha)c.getAnnotation(Haha.class);
System.out.println(haha.name());
}
} public static void main(String[] args) {
Test.show(Test.class);
}
}

  

 输出结果:

spring:

package com.yuan.springboot;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Retention注解:定义被它所注解的注解保留多久(
* SOURCE:被编译器忽略
* ClASS:注解将会被保留在Class文件中,但在有耐性时并不会被VM保留。这是默认行为,所有没有用Retention注解的注解,都会采用这种策略。
* RUNtIME:保留至运行时。所以没有我们可以通过反射去获取注解信息
* )
* Target注解:用于描述杯盖注解标注的注解的作用范围(即:被描述的注解可以用在什么地方)
* 1.CONSTRUCTOR:用于描述构造器
* 2.FIELD:用于描述域
* 3.LOCAL_VARIABLE:用于描述局部变量
* 4.METHOD:用于描述方法
* 5.PACKAGE:用于描述包
* 6. PARAMETER: 用于描述参数
* 7. TYPE: 用于描述类、接口(包括注解类型) 或enum声明
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface CheckType { String value() default "";

  

package com.yuan.springboot;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method; public class CheckTypeInterceptor implements HandlerInterceptor{ @Value("${info.sys.checkType}")
private Integer checkType;//系统中配置的是否需要验证验证码 @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //当获取到的系统中的配置为null时,说明不校验。就放过
if (checkType==null){
return true;
} //将被拦截的方法对象转成HandlerMethod对象
//关于HandlerMethod对象,是用来封装方法定义相关的信息(如:方法所属类,方法的参数,方法本身等)。可以理解成时具有了方法信息的一个实体类
HandlerMethod handlerMethod=(HandlerMethod) handler;
//调用getMethod()方法来获取方法本身
Method method=handlerMethod.getMethod();
//用方法本身来调用getAnnotation(x)方法来拿到参数中传如的注解类
//如果返回值不为空说明方法被该注解标记。否则没有被该注解标记
CheckType checkType=method.getAnnotation(CheckType.class);
if(checkType==null){
return true;
}
String value=checkType.value();
//根据传入的值来做一些业务相关判断 return false;
}
}

  

package com.yuan.springboot;

import com.yuan.springboot.CheckTypeInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /**
* 我们在自定义拦截器的时候,仅仅定义一个类实现HandlerInterceptor接口时不够的
* 我们还要将自定义的拦截器类注册到系统中并重写方法来告诉系统都需要拦截什么样的请求
* so 这里就是实现WebMvcConfigurger接口(此接口时spring boot中的)
* WebMvcConfigurer 接口时springboot定义配置的接口,相当于spring的.xml配置文件
*/
public class SmsConfiguration implements WebMvcConfigurer { //@Bean 注解时将该方法产生的bean交给spring容器管理
@Bean
public CheckTypeInterceptor checkTypeInterceptor(){
return new CheckTypeInterceptor();
} //addInterceptors是来注册拦截器的方法(如果不使用
//springboot 估计要在配置文件中配置了) @Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* addInterceptor("xxx");方法死给注册具体的拦截器的,参数格式为:
* 自定义的注解的对象调用addPathPatterns("xxxx")方法,来为自定义拦截器添加拦截的请求,
* 另外一个方法registry.addInterceptor(checkTypeInterceptor()).addPathPatterns("xxx").excludePathPatterns("xxx","xxx","xxx",...)
* 这里的excludePathPatterns();方法是用来排除特定的请求的,比如首页等。所以一般的做饭是:先用addInterceptor("/**")方法来添加拦截所有的请求,
* 再用excludePathPatterns来排除不需要拦截器的请求即可
*
*/
registry.addInterceptor(checkTypeInterceptor()).addPathPatterns("/customer");
//这昂如果浏览器段的请求格式符合上述配置,那么就会被拦截到。就会进入上面自定义拦截器类中的preHande方法
}
}

  

自定义Java annotation的更多相关文章

  1. [置顶] 自定义java Annotation快速入门与提高

    我们先来看看一个简单的注解类定义 import java.lang.annotation.Documented; import java.lang.annotation.Retention; impo ...

  2. 自定义 Java Annotation ,读取注解值

    1. 首先是自定义注解: package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import java.lang ...

  3. Java Annotation概述

    @(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...

  4. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  5. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

  6. Java Annotation原理分析(一)

    转自:http://blog.csdn.net/blueheart20/article/details/18725801 小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各 ...

  7. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  8. Java Annotation 机制源码分析与使用

    1 Annotation 1.1 Annotation 概念及作用      1.  概念 An annotation is a form of metadata, that can be added ...

  9. Java Annotation手册

    Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...

随机推荐

  1. 一文读懂MQTT协议

    1  概述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级 ...

  2. shell脚本 set命令

  3. Codeforces 1167E 尺取法

    题意:给你一个长度为n的数组,以及数组中的数的取值范围1 - m,问有多少个区间[l, r],使得删除了数组中数值为[l, r]的数之后,数组是非递减的. 思路:我们记录一下每一个数出现的最左端和最右 ...

  4. 【Luogu】【关卡2-14】 树形数据结构(2017年10月)【AK】

    任务说明:由一个根节点分叉,越分越多,就成了树.树可以表示数据之间的从属关系 P1087 FBI树 给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历. ...

  5. Dubbox服务的消费方开发

    开发步骤: (1)创建Maven工程(WAR)dubboxdemo-web ,在pom.xml引入依赖 ,同“dubboxdemo-service”工程.区别就是把tomcat插件的运行端口改为808 ...

  6. mongodb数据库管道操作

    1.$project(修改文档的结构,可以用来重命名.增加或删除文档中的字段) db.order.aggregate([ { $project:{ rade_no:1, all_price:1} } ...

  7. js读取json数据

    { "code": 0, "msg": null, "data": { "pageNum": 1, "page ...

  8. XML 扩展部分

    引入命名空间 xmlns DTD缺点 1.不支持命名空间 2.支持的数据类型很少 3.DTD不可扩展 4.DTD不遵循XML规范 DTD的优点 简洁 schema 通过schema来解决DTD的不足 ...

  9. POJ 1269 Intersecting Lines (判断直线位置关系)

    题目链接:POJ 1269 Problem Description We all know that a pair of distinct points on a plane defines a li ...

  10. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...