Spring中@Autowried注解的实现原理

301 阅读3分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

在使用SpringBoot进行开发工作时,更多的使用Java Config的配置方式来替代xml配置方式。而在使用注解注入容器中的相关bean对象时,一定绕不开的就是@Autowired注解,今天我们就来看一下@Autowired注解是怎么发挥作用的。

学习@Autowired注解,可以配合SpringBoot自定义注解实现一起食用哦!

@Autowired注解定义

首先看一下@Autowired注解的具体定义,源码是这样的:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

从注解的定义信息中可以看到,

  1. 对于@Autowired注解可以使用的位置,@Target注解中使用了五种类型,分别代表的含义为:
    • ElementType.FIELD:用于字段声明
    • ElementType.METHOD:用于方法声明
    • ElementType.PARAMETER:用于正式的参数声明
    • ElementType.CONSTRUCTOR:用于构造函数声明
    • ElementType.ANNOTATION_TYPE:用于注解类型声明
  2. 使用@Retention(RetentionPolicy.RUNTIME)表示当前注解在编译和运行时存在,并可以反向获取。
  3. 注解有属性值required,表示当前需要注入的内容是否是必须的
    • 值为true则表示必须,没找到指定类型时会报错;
    • 值为false则表示不必须,未找到需要注入类型时也不会报错;
    • 默认值为false。

@Autowired注解的实现逻辑

注解实现的基本逻辑

首先我们考虑Spring中注解的基本逻辑,由于注解是基于反射实现的,因此主要有以下步骤:

  1. 定义注解
  2. 实现注解逻辑
  3. 使用注解注释属性、方法、构造器等
  4. 在类初始化时检查类的所有属性、方法、构造器等信息,判断是否有使用该注解,如果使用则将该属性放入集合中
  5. 查找到所有使用该注解的属性后,在SpringContext中找到对应bean并初始化返回

@Autowired注解的实现

  1. 找到@Autowired注解的定义位置,通过对@Autowired注解的定位,可以找到@Autowired存放于org.springframework.beans.factory.annotation包中。image.png
  2. 我们查看@Autowired注解的具体实现逻辑,而AutowiredAnnotationBeanPostProcessor自动装配后置处理器就是用来实现@Autowired注解的具体逻辑的。
  3. AutowiredAnnotationBeanPostProcessor类的方法中会获取bean的所有属性和方法,判断其是否使用了@Autowired注解,并将需要依赖注入的属性信息封装到InjectionMetadata类中。
  4. 最后就是将属性信息对应的bean注入进行,创建bean时(实例化对象和初始化),会调用各种BeanPostProcessor对bean初始化,AutowiredAnnotationBeanPostProcessor负责将相关的依赖注入进来。

最后

今天对@Autowired注解实现的原理学习只是比较简单的流程,总结来讲就是:对于所有的使用@Autowired注入的bean来说,从代码结构上来讲也就是一个普通的成员变量,spring工作时会通过反射在容器内部找到并为这个成员变量赋值,也就是将其赋为期望的类实例,最后完成注入的过程。