spring自定义注解的实现及应用

        本篇文章主要记录如何自己写出一个自己定义的注解,平时我们都是习惯性的用sping提供的注解,比如override注解就是我们最常见的注解,再者spring框架的requestMapping也是我们常见的注解,但是我们大部分都只是知道怎么用,却不知道他是怎么实现的。以及这个注解为什么是这样的功能,如果我要实现其他功能呢?或许你现在还在困惑,我的代码开发的很顺利啊,没有什么地方需要用到注解,其实不然,这是因为你不知道注解强大的功能,当你了解以及熟练的使用注解的时候,你就会有发现新大陆一样的感觉。

        首先说说目前为止,我都有那些地方用到注解,

        1.利用注解实现AOP拦截以及操作日志记录

        2.利用注解实现对前端参数的数据有效性校验。

        3.利用注解结合反射获取java bean属性字段的额外信息

接下来,我们简单介绍下注解的基础知识:

    注解的定义如下:

      图1-1     

只要在定义接口的基础上再interface前面加上@符号,这时候接口就变成了注解的定义了。但是还不完全是完成了注解,还要加上上面几个关键字,,分别是@target和@retention,另外的@documentend和@constraint是非必须的,这几个是什么意思呢?还有都有那些值呢?

      @ target表示该注解的作用域,值有TYPE, METHOD, CONSTRUCTOR, FIELD,我们常用field和method,表示作用在java bean的字段和作用在方法层面上。

   @retention表示注解类型保留时间的长短,它接收RetentionPolicy参数,可能的值有SOURCE, CLASS, 以及RUNTIME,我们常用runtime,表示

在编译以及java vm都会保存,所以可以用来反射阶段获取字段的额外属性值

    @constraint表示注解的约束关系,其中有属性值validateBy这个属性开放出来给我么使用,目的是设定约束关系的实现类,这点与我们上面谈到的第2点有关

    @document表示该注解可以被javadoc等工具文档化

    其次,还要知道以下几点注意事项,

    注解的参数都可以有哪些数据类型呢?

      1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
   2.String类型
   3.Class类型
   4.enum类型
   5.Annotation类型
   6.以上所有类型的数组

     其次还需要注意一点,所有的属性的访问修饰符只能是public或者default,而且每个属性最好都要有默认值

     最后注意一点,如果注解只有一个属性,最好取名为value,后面加上(),比如string value() default "";不要问为什么,这是一种大家共同形成的规范。

    接下来重点介绍下前面提到的第二点和第三点:

    一:利用注解实现对前端参数的数据有效性校验 

    如图1-1所示,我自己定义了一个选择范围的注解器,其中有成员属性min和max,还有message,顾名思义,就是错误提示,怎么应用这三个属性呢?如图1-2:

  

图1-2

类似其他注解一样,注解应用在类的成员属性上,对成员属性min赋值1,max赋值2,表示该成员属性的合法值只能最小为1和最大为2,但是我们只是定义了这个属性,规定这个范围的实际约束在哪呢?这就用到我之前提到的注解的关键字constraint,该属性可以关联一个实体类,表示约束关系的实现,图1-1的属性赋值为validateby = selectRangeValidatorImpl.class,说明我约束关系实现类为selectRangeValidatorImpl,,具体如图1-3


图1-3

     该类必须实现校验接口contraintValidator,泛型参数为注解器,校验的字段类型为int型。其次实现接口的抽象方法initialize和isValid,其中initialize是可以初始化校验参数,可以获取到注解器定义的属性值,isValid是约束关系的实现,校验合法返回true,校验不合法返回false;

    注解的相关内容就这些, 接下来就是如何应用了。前面我们说过,该属性定义在dto的成员属性上,实际上还没起懂真正我们想要的校验,该注解所在的dto必须用在action的接口参数上,结合JSR校验才能起到真正的入参校验,如下图1-4:


图1-4

在我的controller层,入参NewsDetail就是图1-2注解selectRangeValidatorImpl应用的的类,将该类作为controller层接受前端传入的参数,前面加上@Valid校验参数 (缺失这不步骤无法起到校验效果,这就是JSR校验),spring框架就会按照我们约束关系的实现类中的校验规定校验对应参数,若校验结果返回false,则框架就会直接抛出我们定义的messsage消息,达到校验的效果。

猜你喜欢

转载自blog.csdn.net/llf_1241352445/article/details/78388370