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. Samba服务的安装

    Samba的安装 1.准备环境 Centos7 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# setenforce ...

  2. Begin at this time

    学习了一段时间的Python,今天终于下定决心建立博客来记录自己的机器学习之路了.希望这是一个好的开始,希望自己永远不放弃,坚持努力下去.

  3. #ifdef 宏定义一个main编译客户端服务端2套代码

    #include <iostream> using namespace std; #include "ProWrapper.h" #include "Serv ...

  4. react 数据发生变化,页面改变的原理

    数据发生变化,页面改变的原理: 比较虚拟的dom 不怎么损耗性能,真实的dom比较会损耗性能 1.state 数据 2.jsx 模板 3.生成虚拟的dom 3.数据和模板结合,生成虚拟的dom 4.用 ...

  5. ORM与JPA规范

    一.ORM框架 1.ORM简单介绍 对象关系映射,(Object Relational Mapping,简称ORM),是通过使用描述对象和数据库之间的映射的元数据,将面向对象语言程序中的对象自动持久化 ...

  6. 08-03-re-模块

    一组特殊符号组成的表达式,用于描述某种规则.该应用场景生活中随处可见. ​ 例如:让有志青年过上体面的生活,这里面就由规则,即有志青年. 正则表达式的作用,以及使用场景 ​ 1.用于从字符串中匹配满足 ...

  7. Linux系统磁盘分区、删除分区、格式化、挂载、卸载、开机自动挂载的方法总结

    Linux系统按照MBR(Master Boot Record)传统分区模式: 注意:传统的MBR(Master Boot Record)分区方式最大只能分2T容量的硬盘,超过2T的硬盘一般采用GPT ...

  8. input限制字符长度 - composition

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【系统安全性】四、认证Authentication

    四.认证Authentication 1.为什么要认证 对请求.数据进行认证,判断伪造的数据 HTTP请求很脆弱,抓包软件很强大,容易伪造身份,非法获取数据 2.摘要认证 对象:客户端参数.服务端响应 ...

  10. 【转】/bin/bash^M: bad interpreter: 没有那个文件或目录

    运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就是linux和windows之间的不完全兼容,解决的方法有两种: 1 如果os中已经安装dos2un ...