这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
自定义注意在日常开发中经常使用,同时有很多实现自定义注解的方式,本文将带你一一了解。
1.源注解解析
@Retention
1 | js复制代码 //注解只会存在源代码中,将会被编译器丢弃 |
@Target
1 | bash复制代码用于描述类、接口(包括注解类型) 或enum声明 Class, interface (including annotation type), or enum declaration |
2.依赖于@Conditional
原理是是否满足@Conditional中绑定类的条件,如果满足,就将使用注解的类注入进factory,不满足就不注入,只能在类中使用或者配合@bean使用。
1.添加注解类
首先定义一个注解类,定义的变量为参数。
1 | js复制代码@Conditional(CustomOnPropertyCondition.class)意思为CustomOnPropertyCondition类中返回为true才会使用注解 |
2.CustomOnPropertyCondition类
实现condition接口,以下是实现接口后的代码,然后在其中填补。
1 | js复制代码public class CustomPropertyCondition implements Condition { |
1 | js复制代码Map<String, Object> annotationAttributes = annotatedTypeMetadata.getAnnotationAttributes(RequestMapping.class.getName()); 获取类中注解上的参数 |
3.使用注解
1 | js复制代码@RequestMapping(value ="/Demo") |
注解会在在spring boot启动时加载。
3.使用HandlerMethodArgumentResolver
注意该方法只能接受get请求。
1.添加注解类
1 | js复制代码package com.airboot.bootdemo.config; |
2.定义类HandlerMethodArgumentResolver
其中resolveArgument中返回的是controllor的参数,也就是这个方法里面可以组装入参 。UserCheckMethodArgumentResolver 为拦截注解后的逻辑
1 | js复制代码import org.springframework.core.MethodParameter; |
1 | js复制代码import com.airboot.bootdemo.entity.DemoVO; |
3.使用注解
1 | js复制代码 @GetMapping(value = "/selectDemoByVo") |
4.基于aop
该方式在日常最常用。主要使用了AOP的功能。
1.AOP的名词介绍
1 | bash复制代码1.JoinPoint |
2.添加注解类
1 | js复制代码import java.lang.annotation.ElementType; |
3.切面配置
其中切点要切到注解类的路径。
1 | js复制代码import org.aspectj.lang.ProceedingJoinPoint; |
4.使用注解
1 | js复制代码 @RequestMapping(value = "/selectDemoByVo") |
5.拦截器
1.添加注解类
1 | bash复制代码import java.lang.annotation.*; |
2.实现拦截器
主要原理就是拦截所有的请求,然后判断方法上是否有自定的注解,如果有注解,执行注解的操作。
1 | js复制代码import org.springframework.web.method.HandlerMethod; |
3.注册拦截器
1 | js复制代码import org.springframework.context.annotation.Configuration; |
4.使用注解
1 | js复制代码 @RequestMapping(value = "/selectDemoByVo") |
6.ConstraintValidator注解实现验证
此方法大多是验证入参格式使用。
1.添加注解类
其中message是返回值,groups()和payload() 是必须有的。@Constraint(validatedBy = TestConstraintValidator.class) 是处理注解逻辑的类。
1 | js复制代码import javax.validation.Constraint; |
2.逻辑类
需要实现ConstraintValidator<TestConstraintAnnotation, Object>,第一个参数是注解类,第二个参数是入参类型。只有第一次调用时才会调用initialize ,如果满足isValid逻辑,那么就正常执行,不满足会有message提示。
1 | js复制代码public class TestConstraintValidator implements ConstraintValidator<TestConstraintAnnotation, Object> { |
3.使用注解
vo中在需要验证的参数上加上自定义的注解,在方法接收参数前加入@Valid 说明本方法需要验证。
1 | bash复制代码 @RequestMapping(value = "/selectDemoByVo") |
1 | bash复制代码 @TestConstraintAnnotation(min = 1, max = 10) |
本文转载自: 掘金