自定义Java annotation
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的更多相关文章
- [置顶] 自定义java Annotation快速入门与提高
我们先来看看一个简单的注解类定义 import java.lang.annotation.Documented; import java.lang.annotation.Retention; impo ...
- 自定义 Java Annotation ,读取注解值
1. 首先是自定义注解: package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import java.lang ...
- Java Annotation概述
@(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- Java Annotation原理分析(一)
转自:http://blog.csdn.net/blueheart20/article/details/18725801 小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各 ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- Java Annotation 机制源码分析与使用
1 Annotation 1.1 Annotation 概念及作用 1. 概念 An annotation is a form of metadata, that can be added ...
- Java Annotation手册
Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...
随机推荐
- termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率
SYNOPSIS 总览 #include <termios.h> #include <unistd.h> int tcgetattr(int fd, struct termio ...
- 前端用vue,后端需要nodejs吗?
其实用脚趾头想想也知道:后端用不用node,和前端用不用vue,二者完全没关系. 那为何用vue和vue插件开发前端的时候,经常需要各种npm install呢?为何要在本地安装node环境? 本地需 ...
- ubuntu 安装pip并修改为阿里云pip源
0.sudo su1.安装pipapt-get install python-pip python-dev build-essentialpip install --upgrade pip pip i ...
- VS2017编译64位CloudCompare
需求:编译一个支持读写las点云的CC,然后再开发CC插件实现业务功能. 编译环境: 1.Windows 10 2.Visual Studio 2017 Community 3.Qt 5.9.4 开源 ...
- Java中static关键字的定义
1.static存在的主要意义 static的主要意义是在于创建独立于具体对象的域变量或者方法.以致于即使没有创建对象,也能使用属性和调用方法! static关键字还有一个比较关键的作用就是 用来形成 ...
- javaWEB 之文件的上传
1.1 文件上传三要素 提供form表单,method必须是post form表单的enctype必须是multipart/form-data 提供 input type=“file” 类型输入 1. ...
- 后端异步接口url
/wp-common/products.php?term_id=4&page=1 var currentAjax; var total = 0; function getAjaxData(te ...
- 离线+生成树+并查集——cf1213G
#include<bits/stdc++.h> using namespace std; #define N 200005 #define ll long long struct Edge ...
- fiddler对浏览器、app抓包及证书安装
1.fiddler对浏览器抓包 1.1 对浏览器的http的抓包 Capturing开启,进行抓包: Capturing关闭,停止抓包: 如下图: 1.2 对浏览器的https抓包 1.2.1 开启 ...
- 在Visual C++中使用内联汇编
一.内联汇编的优缺点 因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C++中不能处理的一些事情,而且可以使用在C/C++中的变量,所以非常方便.内联汇编主 ...