1.邂逅注解

在开发过程中,咱们用过很多注解。例如 @Override、@Autowired、@RestController 等。

注解官方解说:

从 JDK5 开始,Java 增加对元数据的支持,也便是注解,注解与注释是有必定差异的,能够把注解理解为代码里的特殊符号,这些符号能够在编译,类加载,运行时被读取,并履行相应的处理。通过注解开发人员能够在不改动原有代码和逻辑的情况下在源代码中嵌入弥补信息。

浅显来讲,注解就像访问某资源的一种约束条件,你只有满意了这个条件,你才有权限进行某些操作。

例如你假如去看周杰伦演唱会,你需求先掏钱买门票,不然会被门口的工作人员拦下来。

在实践开发中,创立注解很简单,怎么履行注解的约束条件才是要害。

所以自定义注解通常会和 SpringMVC 的拦截器或许 AOP 一起运用。

拦截器和 AOP 能够看作演唱会门口的工作人员。你买了演唱会门票,工作人员就让你进去看演唱会。某次恳求满意了注解的约束条件,拦截器和 AOP 就放行该恳求,持续往下履行。

2.自定义注解

创立的自定义注解首要包含三部分:

  • 1.注解姓名前面用 @interface 进行标识

  • 2.元注解

  • 3.特点

真实案例!java自定义注解实战!

元注解

元注解又叫做注解的注解,其实便是对该注解的一些解说阐明。例如咱们买的演唱会门票,上面标注的有时间、地址、座位等。

咱们常用的元注解首要有两个:@Target 和 @Retention

@Retention 表明该注解的运用时间,里边的变量是一个枚举。

真实案例!java自定义注解实战!

RetentionPolicy.RUNTIME 表明该注解在程序运行时会被用到,咱们在实践开发中也常常运用该变量。

@Target 表明该注解作用的方位,里边的变量是一个枚举。

真实案例!java自定义注解实战!

  • ElementType.TYPE:作用在类、接口或枚举上面
  • ElementType.FIELD:作用在成员变量上面
  • ElementType.METHOD:作用在办法上面
  • ElementType.PARAMETER:作用在办法参数上面
  • ElementType.CONSTRUCTOR:作用在构造器上面
  • ElementType.LOCAL_VARIABLE:作用在局部变量上面
  • ElementType.ANNOTATION_TYPE:作用在注解上面
  • ElementType.PACKAGE:作用在包上面

在实践开发中咱们会常常用到 TYPE、METHOD、PARAMETER。

特点

元注解是对注解作了一些通用的阐明,而注解的特点对注解作了一些特定的阐明。

真实案例!java自定义注解实战!

语法格局:

数据类型 变量名() default 默认值

注解的特点不是有必要的。咱们在创立注解特点的时分假如没有设置默认值,那么在运用的时分有必要设置值,例如:

真实案例!java自定义注解实战!

真实案例!java自定义注解实战!

假如注解的特点只有一个,并且特点名为 value(),那么在运用注解的时分,能够疏忽特点名和 ‘=’号,直接在括号里为其赋值,例如:

真实案例!java自定义注解实战!

真实案例!java自定义注解实战!

3.实战

这三个自定义注解的小事例都是根据 SpringBoot 进行开发,后边会给出完好代码。

依靠:

spring-boot-starter-web
lombok
java-jwt
spring-boot-starter-data-redis
hutool-all
redisson-spring-boot-starter
aspectjweaver

application.yml:

真实案例!java自定义注解实战!

3.1 自定义注解和拦截器获取当时登录用户

1.创立注解

该注解作用在办法参数上。

真实案例!java自定义注解实战!

2.创立拦截器

首要获取 token,然后用 jwt 校验 token 信息,再根据 token 信息从 Redis 里边获取用户信息。

最要害的一步是将用户信息存放到 request 域里边。

真实案例!java自定义注解实战!

3.装备注解解析器

真实案例!java自定义注解实战!

注解解析器的履行流程是有必要要满意 supportsParameter,然后才会履行 resolveArgument。

也便是需求满意下面条件:

真实案例!java自定义注解实战!

当参数的注解是 @CurrentUser ,参数的类型是 User 类的时分,就会从 Request 域中查出用户信息,并赋值给 @CurrentUser 注解标注的 user 参数。

4.注册拦截器和解析器

真实案例!java自定义注解实战!

5.controller

真实案例!java自定义注解实战!

6.测试

用户登录,回来 token 信息

真实案例!java自定义注解实战!

调用用户列表接口:

真实案例!java自定义注解实战!

真实案例!java自定义注解实战!

真实案例!java自定义注解实战!

3.2 自定义注解和拦截器完成接口约束功用

1.创立注解

真实案例!java自定义注解实战!

2.创立拦截器

中心逻辑便是将注解上设置的年纪和用户的年纪做对比。

真实案例!java自定义注解实战!

3.注册拦截器

真实案例!java自定义注解实战!

4.controller

真实案例!java自定义注解实战!

5.测试

当时用户年纪 12,自定义注解年纪的约束是 18岁。

真实案例!java自定义注解实战!

3.3 自定义注解和 AOP、Redisson 避免重复提交

1.创立注解

真实案例!java自定义注解实战!

2.装备 redis 和 redisson

真实案例!java自定义注解实战!

真实案例!java自定义注解实战!

3.装备 aop

中心便是运用 redis 的分布式锁,在访问接口之前先获取锁,获取锁成功再访问该接口。在锁失效的时间内重复点击该接口,假如获取锁失败,就回来错误信息。

真实案例!java自定义注解实战!

4.controller

真实案例!java自定义注解实战!

5.测试

真实案例!java自定义注解实战!

4.完好代码

gitee:

https://gitee.com/zhifou-tech/spring-annotation.git

百度网盘:

链接:https://pan.baidu.com/s/1vq8NsO3rp1qGmqkoCSOvJQ?pwd=1234
提取码:1234