笔记大纲
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,让对象调用方法执行注入。