我们通过之前的学习已经知道注解在Spring MVC中扮演着举足轻重的角色,比如说其中最重要的两个注解:@Controller和@RequestMapping。虽然,我们在之前的文章里介绍了这些注解的作用和一些工作机制,但是还是会有许多人不知道注解的原理。本文我们就为大家解惑,揭示Spring MVC注解原理。
关于注解首先引入官方文档的一句话:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。
注解本质是一个继承了Annotation的特殊接口,其具体实现类是运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
接下我们将从注解各个方面全面再次地了解Spring MVC注解。
1.注解的定义
日常开发中新建Java类,我们使用class、interface比较多,而注解和它们一样,也是一种类的类型,他是用的修饰符为 @interface。
2.注解类的写法
我们新建一个注解MyTestAnnotation
public @interface MyTestAnnotation {
}
接着我们就可以在类或者方法上作用我们刚刚新建的注解
@MyTestAnnotation
public class test {
@MyTestAnnotation
public static void main(String[] args){
}
}
3.元注解
元注解顾名思义我们可以理解为注解的注解,它是作用在注解中,方便我们使用注解实现想要的功能。元注解分别有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五种。
4.注解的属性
注解的属性其实和类中定义的变量有异曲同工之处,只是注解中的变量都是成员变量(属性),并且注解中是没有方法的,只有成员变量,变量名就是使用注解括号中对应的参数名,变量返回值注解括号中对应参数类型。相信这会你应该会对上面的例子有一个更深的认识。而@Repeatable注解中的变量则类型则是对应Annotation(接口)的泛型Class。
/**注解Repeatable源码*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
/**
* Indicates the containing annotation type for the
* repeatable annotation type.
* @return the containing annotation type
*/
Class value();
}
5.注解的本质
注解的本质就是一个Annotation接口
/**Annotation接口源码*/
public interface Annotation {
boolean equals(Object obj);
int hashCode();
Class annotationType();
}
注解本身就是Annotation接口的子接口,也就是说注解中其实是可以有属性和方法,但是接口中的属性都是static final的,对于注解来说没什么意义,而我们定义接口的方法就相当于注解的属性,也就对应了前面说的为什么注解只有属性成员变量,其实他就是接口的方法,这就是为什么成员变量会有括号,不同于接口我们可以在注解的括号中给成员变量赋值。
6.注解属性类型
注解属性类型可以有以下列出的类型
-基本数据类型
-String
-枚举类型
-注解类型
-Class类型
-以上类型的一维数组类型
7.注解的作用
提供信息给编译器:编译器可以利用注解来检测出错误或者警告信息,打印出日志。
编译阶段时的处理:软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
运行时处理:某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。
正如官方文档的那句话所说,注解能够提供元数据,转账例子中处理获取注解值的过程是我们开发者直接写的注解提取逻辑,处理提取和处理 Annotation 的代码统称为 APT(Annotation Processing Tool)。上面转账例子中的processAnnotationMoney方法就可以理解为APT工具类。
看完了本文多方面对Spring MVC注解原理的解析,相信你对Spring MVC中的@Controller和@RequestMapping核心注解的理解更加深入了,对于其他的注解的理解和学习也更容易了。诸如此类的解析在Spring MVC视频教程中还有更好的体现,对Spring MVC感兴趣的话可以随时在线上学习哦。
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13