这是我参与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;
}
从注解的定义信息中可以看到,
- 对于@Autowired注解可以使用的位置,@Target注解中使用了五种类型,分别代表的含义为:
ElementType.FIELD:用于字段声明ElementType.METHOD:用于方法声明ElementType.PARAMETER:用于正式的参数声明ElementType.CONSTRUCTOR:用于构造函数声明ElementType.ANNOTATION_TYPE:用于注解类型声明
- 使用
@Retention(RetentionPolicy.RUNTIME)表示当前注解在编译和运行时存在,并可以反向获取。 - 注解有属性值
required,表示当前需要注入的内容是否是必须的- 值为true则表示必须,没找到指定类型时会报错;
- 值为false则表示不必须,未找到需要注入类型时也不会报错;
- 默认值为false。
@Autowired注解的实现逻辑
注解实现的基本逻辑
首先我们考虑Spring中注解的基本逻辑,由于注解是基于反射实现的,因此主要有以下步骤:
- 定义注解
- 实现注解逻辑
- 使用注解注释属性、方法、构造器等
- 在类初始化时检查类的所有属性、方法、构造器等信息,判断是否有使用该注解,如果使用则将该属性放入集合中
- 查找到所有使用该注解的属性后,在SpringContext中找到对应bean并初始化返回
@Autowired注解的实现
- 找到@Autowired注解的定义位置,通过对@Autowired注解的定位,可以找到@Autowired存放于
org.springframework.beans.factory.annotation包中。 - 我们查看@Autowired注解的具体实现逻辑,而
AutowiredAnnotationBeanPostProcessor自动装配后置处理器就是用来实现@Autowired注解的具体逻辑的。 - 在
AutowiredAnnotationBeanPostProcessor类的方法中会获取bean的所有属性和方法,判断其是否使用了@Autowired注解,并将需要依赖注入的属性信息封装到InjectionMetadata类中。 - 最后就是将属性信息对应的bean注入进行,创建bean时(实例化对象和初始化),会调用各种
BeanPostProcessor对bean初始化,AutowiredAnnotationBeanPostProcessor负责将相关的依赖注入进来。
最后
今天对@Autowired注解实现的原理学习只是比较简单的流程,总结来讲就是:对于所有的使用@Autowired注入的bean来说,从代码结构上来讲也就是一个普通的成员变量,spring工作时会通过反射在容器内部找到并为这个成员变量赋值,也就是将其赋为期望的类实例,最后完成注入的过程。