Spring依赖注入主流程

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流程

在这里插入图片描述

5.@Resource流程

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minor王智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值