Spring 注解的原理
转自
https://blog.csdn.net/u010987379/article/details/52152795
https://www.cnblogs.com/lsx1993/p/4793124.html
Spring 注解原理
看完上面的文章,简单做一下总结,第一次发博客,聊一下spring注解的原理,如果有不对的地方请指正(如有侵权,立马删除,请联系我)
当我们想了解一个注解的时候,不妨打开它看看,比如说这个 @RestController注解,这个注解是一个复合注解,它包含了三个元注解和两个spring注解。
我们这里不主要讲这三个元注解,元注解总共有四个,
*分别是@Target,@Retention,@Documented,@Inherited
*
- @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
- ElemenetType.CONSTRUCTOR 构造器声明
- ElemenetType.FIELD 域声明(包括 enum 实例)
- ElemenetType.LOCAL_VARIABLE 局部变量声明
- ElemenetType.METHOD 方法声明
- ElemenetType.PACKAGE 包声明
- ElemenetType.PARAMETER 参数声明
- ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
- @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
- RetentionPolicy.SOURCE 注解将被编译器丢弃
- RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
- RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
- @Documented 将此注解包含在 javadoc 中
- @Inherited 允许子类继承父类中的注解
spring注解
打开其中的@Controller 发现和上一个接口类似的结构,@interface这个东东不是一个接口,和接口类似,当我们用一个@interface修饰我们的类的时候,证明我们这个类是一个注解,并且继承了java.lang.annotition.Annotition
Annotation其实是一种接口。通过Java的反射机制相关的API来访问Annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。Java语言解释器在工作时会忽略这些Annotation,因此在JVM中这些Annotation是“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。
这个时候我们就应该想到了 spring注解的启动原理应该是这样的;
1、spring IOC容器启动的时候,根据我们指定的路径下去扫描我们的类,或者是直接扫描当前路径下的类;
2、在java中我们可以通过 Object obj = new Object()的方式来创建一个对象;那么spring 其实也是一样的,当我们的程序启动,告诉容器路径,它去指定的地方去加载bean,利用java的反射将我们类new出来,其实这个过程就是“依赖注入”,那么当我拿到这个对象的时候,通过getClass()方法得到它的类,再通过getAnnotations()方法得到这个类的注解;
这是我定义的RestController 对象
这是我的接口,通过这种
Annotation[] annotation = this.getClass().getAnnotations();
控制台就可以打印出这个class上面有些什么注解了
3、这个时候我们就可以想到,这个注解其实就是spring在扫描我们的类的时候,拿到我们的class,然后通过这个方式得到了我们在class上面的注解,spring根据自己定义的规则,解析这个注解,以达到相应的效果
4、同理在 Method 上也可以getAnnotations();
5、这样我们就可以在加载bean的时候实现 ,通过反射实例化我们的bean,然后通过getAnnotations()方法得到类和方法上的注解,然后根据自己定义的规则去实现各个注解需要做什么事情。
第一次发博客,如有侵权,请联系我,如有不对,请指正;