Spring DI解析_2

首先,DI的时机是在被注入的Bean实例化后,调用populateBean(填充Bean)方法时进行的
在这里插入图片描述

我们可以看到,刚进入populateBean方法时,会对该Bean执行InstantiationAwareBeanPostProcessor接口实现类的postProcessAfterInstantiation方法,这部分逻辑可以控制是否跳过注入过程,只要有一个InstantiationAwareBeanPostProcessor接口实现类的postProcessAfterInstantiation返回false,就直接退出populateBean方法了:
在这里插入图片描述

接下来会获取当前bean的autowireMode,默认都是0,即AUTOWIRE_NO,下面的一大段if判断都跳过:
在这里插入图片描述

接下来会对该Bean执行InstantiationAwareBeanPostProcessor的实现类的postProcessProperties方法,在执行到CommonAnnotationBeanPostProcessor的postProcessProperties会执行Dependency inject逻辑(由于注入时用的是@Resource注解,故用的是CommonAnnotationBeanPostProcessor,若用的是@Autowired,则用的是AutowiredAnnotationBeanPostProcessor,AutowiredAnnotationBeanPostProcessor的注入逻辑也是在postProcessProperties里,和CommonAnnotationBeanPostProcessor的postProcessProperties处理逻辑几乎一致):
在这里插入图片描述

接下来看看CommonAnnotationBeanPostProcessor的postProcessProperties方法里的注入逻辑,第一步先调用findResourceMetadata方法从缓存injectionMetadataCache中获取待DI的Bean的的注入元信息metadata(扫描待注入点并加入到缓存中的逻辑请看《Spring DI解析_1》),metadata里包含有该Bean待被注入的点的信息,比如某个Field的访问类型,对象类型,field name等。
在这里插入图片描述

然后调用InjectionMetadata的inject方法进行注入逻辑,对每一个注入点进行注入逻辑:
在这里插入图片描述

这次我们的例子是Field注入,所以走的是if分支,else分支是Method注入的逻辑。
首先获取到注入点的Field对象,然后调用getResourceToInject方法获得注入的Bean后,将该Bean set进要注入的Field对象中:
在这里插入图片描述

调用ResourceElement(InjectedElement的后代类)的getResourceToInject方法,最终会调用到getResource方法:
在这里插入图片描述

getResource方法里jndi的逻辑先不管,直接看最后调用autowireResource方法:
在这里插入图片描述

调用到AutowireCapableBeanFactory的resolveBeanByName方法来获取注入的Bean。(第二层嵌套的if判断里的factory.containBean(name)不一定是bean已被实例化了才返回true,bean没有被实例化但是有对应的BeanDefinition也行,所以最终走到else分支)
在这里插入图片描述

然后调用AbstractAutowireCapableBeanFactory的getBean(String name, Class requiredType)方法
在这里插入图片描述
在这里插入图片描述

后续就是IOC容器生成注入的Bean的逻辑的。

最后生成了注入的Bean,并赋值给resource变量:
在这里插入图片描述

最后返回的注入的bean会被注入到被注入的Field对象中:
在这里插入图片描述

以上就是Spring DI的大致流程;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值