笔记大纲

  • 1.手动依赖注入
  • 2.XML形式的自动注入
  • 3.@Autowired自动注入原理
  • 3.1 @Autowired特点
  • 3.2 寻找注入点(postProcessor机制实现)
  • 3.3 注入
  • 3.3.1 属性注入
  • 3.3.2 set注入
  • 4.@Autowired流程
  • 5.@Resource流程


1.手动依赖注入

在XML配置的形式下,在标签中可以手动注入属性的ref引用关系或者指定构造的注入,称之为手动注入的形式(set注入、构造注入)。

2.XML形式的自动注入

在标签中可以配置autowire的自动注入方式是byType还是byName还是构造等,在创建Bean的过程中Spring将这个类的所有方法解析出来通过一定的规则进行筛选(例如set方法)然后进行属性注入。

3.@Autowired自动注入原理

3.1 @Autowired特点

它是byType和byName的结合,注解可以使用在:

- 属性:优先byType寻找,如果存在多个则再根据名字查找。
        - 构造:优先根据方法参数类型byType寻找,如果存在多个则再根据名字查找。
        - set方法:优先根据方法参数类型byType寻找,如果存在多个则再根据名字查找。

3.2 寻找注入点(postProcessor机制实现)

在Bean的实例化阶段时,Spring利用AutowiredAnnotationBeanPostProcessor拓展机制调用#postProcessMergedBeanDefinition()方法来对Autowired注解的注入点寻找。寻找的流程大致为:

1. 遍历当前Bean类的所有字段属性。
     1. 检查这个属性上是否加了`@Autowired、@Value、@Inject`的其中任意一个注解,如果有,则认为这是一个注入点。
     1. 判断字段是否是static静态修饰的,如果是,则跳过,不进行注入。
     1. 获取Autowired注解中的required属性值(这个值代表注入是否可以非null,默认是false)。
     1. 将这个属性字段封装成一个`AutowiredFiledElement`对象,放入Elements集合中。
     1. 开始这个Bean类的所有方法遍历。
     1. 检查这个方法上是否加了`@Autowired、@Value、@Inject`的其中任意一个注解,如果有,则认为这是一个注入点。
     1. 如果方法时静态方法,则跳过,不视为注入点。
     1. 获取Autowired注解中的required属性值(这个值代表注入是否可以非null,默认是false)。
     1. 将这个方法封装成一个`AutowiredFiledElement`对象,放入Elements集合中。
     1. 返回这个注入点集合。

3.3 注入

Spring基于AutowiredAnnotationBeanPostProcessor#postProcessProperties()方法中,遍历所有的注入点,然后依次注入调用。

3.3.1 属性注入

从BeanFactory容器中调用resolveDependency方法,进行Bean对象的查找,通过反射进行值的注入。

3.3.2 set注入

和属性注入一样,从BeanFactory中寻找并通过反射invoke,让对象调用方法执行注入。

4.@Autowired流程

spring new 依赖注入 spring依赖注入过程_后端

5.@Resource流程

spring new 依赖注入 spring依赖注入过程_面试_02