
在Spring MVC中,我们可以使用自定义注解来扩展和定制化我们的应用程序。自定义注解是一种通过Java的注解机制定义的特殊注解,可以应用于控制器类、方法或者方法参数上,以实现不同的功能和行为。
路由映射:可以定义一个自定义注解来标注控制器方法,以指定该方法的URL映射路径。
权限控制:可以定义一个自定义注解,用于标记需要进行权限验证的方法,从而实现简单的权限控制逻辑。
参数验证:可以定义一个自定义注解,用于标记方法参数,然后结合AOP等技术,在方法执行前或后进行参数的验证和校验。
日志记录:可以定义一个自定义注解,用于标记需要进行日志记录的方法,从而实现日志的统一处理。
缓存控制:可以定义一个自定义注解,用于标记需要进行缓存管理的方法,从而实现缓存的自动化管理。
定义注解:使用注解语法,在相关的注解类上定义自定义注解,可以指定注解的目标范围和属性。
标记使用:在控制器类、方法或者方法参数上使用自定义注解,标识需要应用自定义逻辑的地方。
处理注解:通过Spring的AOP、拦截器等机制,对标记了特定自定义注解的类、方法或者参数进行处理,实现相关的功能。
@Retention:定义注解的保留策略@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,@Retention(RetentionPolicy.RUNTIME)//注解会在class字节码文件中存在,在运行时可以通过反射获取到@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)@Target(ElementType.TYPE) //接口、类@Target(ElementType.FIELD) //属性@Target(ElementType.METHOD) //方法@Target(ElementType.PARAMETER) //方法参数@Target(ElementType.CONSTRUCTOR) //构造函数@Target(ElementType.LOCAL_VARIABLE) //局部变量@Target(ElementType.ANNOTATION_TYPE) //注解@Target(ElementType.PACKAGE)//包@Inherited:指定被修饰的Annotation将具有继承性@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.
可能有的同学看到这么多有点蒙,其实大可不必,实际开发中常用的也就几个。下面我们一块来看下怎么声明和使用注解。
使用@interface关键字 来声明注解
示例:
1、注解可用于类、接口、方法、属性、方法参数;可以根据自己的需求添加或去除
2、始终不会丢弃,运行期也保留该注解。
3、支持子类继承
返回类型根据实际情况自行定义即可
package com.mkj.publicservice.utils.annotationtest;import java.lang.annotation.*;/*** @author: mkj*/@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface MyAnnotateOne {//返回类型自定义即可String classTest() default "classTest";String[] methodTest() default "methodTest";String fieldTest() default "fieldTest";String parameterTest() default "parameterTest";}
@MyAnnotateOne(classTest = "classTest001")public class AnnotateTest {@MyAnnotateOne(classTest = "classTest001",fieldTest = "fieldTest001")private String name;@MyAnnotateOne(methodTest = {"methodTest001","methodTest002"})public void test001(@MyAnnotateOne(parameterTest = "parameterTest001") String params){System.out.println(params);}}
@Testpublic void test() throws Exception {//获取类上的注解MyAnnotateOne myAnnotateClass = AnnotateTest.class.getAnnotation(MyAnnotateOne.class);System.out.println("类上的注解--"+myAnnotateClass.classTest());//获取属性注解MyAnnotateOne myAnnotateField =AnnotateTest.class.getDeclaredField("name").getAnnotation(MyAnnotateOne.class);System.out.println("属性注解"+myAnnotateField.classTest()+"--"+myAnnotateField.fieldTest());//获取方法上的注解MyAnnotateOne myAnnotateMethod =AnnotateTest.class.getMethod("test001",String.class).getAnnotation(MyAnnotateOne.class);String methodStr = "";for (String methodVlaue : myAnnotateMethod.methodTest()){methodStr+=methodVlaue+",";}System.out.println("方法上的注解"+methodStr);//获取参数上的注解Parameter[] parameters = AnnotateTest.class.getMethod("test001",String.class).getParameters();for (Parameter parameter : parameters){MyAnnotateOne myAnnotateParameter = parameter.getAnnotation(MyAnnotateOne.class);if (myAnnotateParameter!=null){System.out.println("参数上的注解"+myAnnotateParameter.parameterTest());}}}
输入结果如下:

此处需说明一个方法
AnnotateTest.class.getMethod("test001",String.class)
这个方法需要注意,第二个参数是你方法里参数的类型。如果是两个String类型的参数,就需要这么写。
AnnotateTest.class.getMethod("test001",String.class,String.class)
AOP配合注解如何使用请参考这篇文章:掌握AOP在SpringBoot项目中的高效集成与优雅编程,实现模块化行为封装与日志管理。
作者介绍
本篇文章来源于微信公众号: Java技术仓库
微信扫描下方的二维码阅读本文

Comments NOTHING