注解介绍

在Spring MVC中,我们可以使用自定义注解来扩展和定制化我们的应用程序。自定义注解是一种通过Java的注解机制定义的特殊注解,可以应用于控制器类、方法或者方法参数上,以实现不同的功能和行为。

可实现功能

路由映射:可以定义一个自定义注解来标注控制器方法,以指定该方法的URL映射路径。

权限控制:可以定义一个自定义注解,用于标记需要进行权限验证的方法,从而实现简单的权限控制逻辑。

参数验证:可以定义一个自定义注解,用于标记方法参数,然后结合AOP等技术,在方法执行前或后进行参数的验证和校验。

日志记录:可以定义一个自定义注解,用于标记需要进行日志记录的方法,从而实现日志的统一处理。

缓存控制:可以定义一个自定义注解,用于标记需要进行缓存管理的方法,从而实现缓存的自动化管理。

使用自定义注解流程

定义注解:使用注解语法,在相关的注解类上定义自定义注解,可以指定注解的目标范围和属性。

标记使用:在控制器类、方法或者方法参数上使用自定义注解,标识需要应用自定义逻辑的地方。

处理注解:通过Spring的AOP、拦截器等机制,对标记了特定自定义注解的类、方法或者参数进行处理,实现相关的功能。

JDK元注解
@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);    }}
测试注解
@Test    public 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项目中的高效集成与优雅编程,实现模块化行为封装与日志管理。

作者介绍

90年,属马,上班族,怀揣梦想,坚持用心分享,一直想通过自己的努力做出一些成绩。佩服通过自己的坚持实现梦想的人。相信滴水穿石,相信点滴的积累终有一天可以成为自己炫耀的资本!

本篇文章来源于微信公众号: Java技术仓库



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-08-02