Spring 注解的原理
转自

https://blog.csdn.net/u010987379/article/details/52152795
https://www.cnblogs.com/lsx1993/p/4793124.html

Spring 注解原理

看完上面的文章,简单做一下总结,第一次发博客,聊一下spring注解的原理,如果有不对的地方请指正(如有侵权,立马删除,请联系我)

当我们想了解一个注解的时候,不妨打开它看看,比如说这个 @RestController注解,这个注解是一个复合注解,它包含了三个元注解和两个spring注解。
Spring 注解的原理
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
Spring 注解的原理
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()方法得到这个类的注解;
Spring 注解的原理
这是我定义的RestController 对象
Spring 注解的原理
这是我的接口,通过这种
Annotation[] annotation = this.getClass().getAnnotations();
控制台就可以打印出这个class上面有些什么注解了
Spring 注解的原理
3、这个时候我们就可以想到,这个注解其实就是spring在扫描我们的类的时候,拿到我们的class,然后通过这个方式得到了我们在class上面的注解,spring根据自己定义的规则,解析这个注解,以达到相应的效果
4、同理在 Method 上也可以getAnnotations();
5、这样我们就可以在加载bean的时候实现 ,通过反射实例化我们的bean,然后通过getAnnotations()方法得到类和方法上的注解,然后根据自己定义的规则去实现各个注解需要做什么事情。

第一次发博客,如有侵权,请联系我,如有不对,请指正;

相关文章: