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. 2018-8-10-win10-uwp-json

    title author date CreateTime categories win10 uwp json lindexi 2018-08-10 19:16:53 +0800 2018-2-13 1 ...

  2. java是否是“美丽的”语言

    java 学习  (jdk扫描   配置读取   服务器选项  )

  3. 【转载】sublime text3 全攻略

    给个链接:http://www.w3cfuns.com/blog-5466732-5405668.html 等作者更新完后自己再整理

  4. 利用jion阻塞主进程结束

    import time from multiprocessing import Process def run1(): for i in range(5): print("sunck is ...

  5. vue 使用Better-Scroll

    注意点 1. 外层容器wrapper要设置高度,并且overflow:hidden. 2. wrapper里面的需要一个div包裹所有内容 3. 样式成功 4.  以上就是可以滚动的情况,wrappe ...

  6. 63. (FileInputStream)输入字节流

    IO分类:    按照数据流向分类:        输入流                输出流        按照处理的单位划分:        字节流:字节流读取的都是文件中的二进制数据,读取到的 ...

  7. git - Mac生成SSH key

    步骤1.检查是否已经存在SSH Key 打开电脑终端,输入以下命令: ls -al ~/.ssh 会出现两种情况 步骤2. 生成/设置SSH Key 继续上一步可能出现的情况 (1)情况一: 终端出现 ...

  8. docker哪些平台技术(3)

    容器平台技术 容器核心技术使得容器能够在单个 host 上运行.而容器平台技术能够让容器作为集群在分布式环境中运行. 容器平台技术包括容器编排引擎.容器管理平台和基于容器的 PaaS. 容器编排引擎 ...

  9. idea 中使用dataBase插件

    最近一段时间重新开始学习Java 使用IntelliJ 发现有个链接数据库插件挺好用的,并且反应速度还挺快的记录下. 点击步骤:View → Tool Windows → data 进行数据库链接 发 ...

  10. Code::Blocks

    Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. Code::Blocks是开放源码软件.Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库w ...