Spring实现自定义注解
自定义注解的意义
自定义注解是一种代码标签,其本身并没有任何作用。只有在特定的场景下由特定的代码去解析处理才有作用和意义。
自定义注解本身是为了简化代码开发,解耦,提高代码的可读性和维护性。
Spring常用注解
元注解:元注解就是注解的注解。主要有以下几种:
- Retention:定义注解的生命周期。
- Dicumented:文档注解化,会被javadoc工具文档化。
- Inherited:标注注解继承的。
- Target:通过ElementType指定注解的的使用范围。
Target的ElementType值描述:
注解语法
- 成员方法需要是无参无异常的。
- 可以使用defafult来赋默认值。
- 成员方法的返回类型必须是八大基础数据类型,封装类型不行,如:String,Class,Annotation,枚举类型等。
- 如果注解中只有一个方法,则方法名为value。
- 注解类中可以没有任何成员信息,这样的注解为标识注解。
注解作用域@Retention
Retention,注解的生命周期(作用域)是由该注解维护的。
主要有以下几种配置:
- Source:源码注解,只存在源码中,编译成class文件后就会消失。(RetentionPolicy.SOURCE)
- Class:编译时注解,在源码和class文件中存在,在运行时会移除,比如:@Override。(RetentionPolicy.CLASS)
- runtime:运行时注解,会保留到代码运行的时候,甚至可能会影响运行时逻辑。比如:@Autowired。(RetentionPolicy.RUNTIME)
@Target注解
@Target 定义注解的使用位置,用来说明该注解可以被声明在哪些元素之前。
常见声明如下:
- ElementType.TYPE:说明该注解只能被声明在一个类前。
- ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
- ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
- ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
- ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
- ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
- ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
- ElementType.PACKAGE:说明该注解只能声明在一个包名前。
引入依赖
1 | // javax.validation |
字段注解
字段注解一般是用于校验字段是否满足要求,hibernate-validate依赖提供了很多校验注解 ,如@NotNull、@Range等,但这些注解并不能够满足所有的业务场景。
Check注解接口实现
1 | import javax.validation.Constraint; |
Check注解验证类实现
1 | import javax.validation.ConstraintValidator; |
验证对象Entity实现
1 | import javax.validation.constraints.NotNull; |
测试控制层实现
1 | import org.springframework.validation.annotation.Validated; |
方法&类注解
权限注解使用场景。
权限注解接口实现
1 | import java.lang.annotation.ElementType; |
拦截器配置类实现
1 | import org.springframework.context.annotation.Configuration; |
权限验证拦截类实现
1 | import org.springframework.web.method.HandlerMethod; |
测试控制层实现
1 | import org.springframework.web.bind.annotation.GetMapping; |