spring源码分析——依赖注入(Resource注解注入以及 @Value注入)

 

  接上一节看一下Resource注解的注入,@Resource注解的注入主要依赖于CommonAnnotationBeanPostProcessor对象,这个埋点的过程与@Autowired类似,

包括BeanDefinition的注册、对象的实例化、搜集类上的注解信息、拦截getBean实例化对象。

一:@Resource注解分析

1:准备工作

 运行结果:

 

 

 

2:搜集注解信息

 

 

 

 

 

 

 

 

 搜集完注解信息后,封装到InjectionMetadata对象上,缓存到injectionMetadataCache集合中

 

 

 类上的注解信息搜集完成后,看一下拦截方法: populateBean方法

 

 

 

 

 

 

这里有个getResourceToInject方法,获取依赖的bean对象:

 

 

 

 

 

 

 

Resource注解基本和Autowired注解类似,就是拦截后,获取依赖的bean的流程有少许差异。

 

二:@Value注解分析

1:准备工作,加一个level字段,在该属性上加注解@Value信息

 

配置信息properties 

 

 运行结果,注入成功

 

 

2:源码分析,@Value注解使用的是AutowiredAnnotationBeanPostProcessor类

先看一下搜集注解信息

 

 

 

 

AutowiredAnnotationBeanPostProcessor类主要搜集@Autowired和@Value注解的元数据信息

 

 在来看一下populateBean中的拦截设置属性的方法:

 

 

从缓存中取出注解,然后注入

 

 

 

 

 

 

 

 

 

 

 将value值返回,执行inject这个动作,@Value注解注入完成。

 

总结:Resource注解是jdk提供的,它的实现主要依赖CommonAnnotationBeanPostProcessor,@Value注解是spring框架提供

和Autowired注解一样,是依赖于AutowiredAnnotationBeanPostProcessor,流程基本相同,都会注册、实例化BeanPostProcessor对象,

在实例化对象完成后,设置属性值之前polulateBean之前,会搜集类上的注解元数据信息,然后在polulalteBean中拦截,执行

BeanPostProcessor中的方法,反射注入依赖的值。

 

posted @ 2020-07-02 13:09  warrior1234  阅读(1530)  评论(0编辑  收藏  举报