接上一节看一下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注解的元数据信息
从缓存中取出注解,然后注入
将value值返回,执行inject这个动作,@Value注解注入完成。
总结:Resource注解是jdk提供的,它的实现主要依赖CommonAnnotationBeanPostProcessor,@Value注解是spring框架提供
和Autowired注解一样,是依赖于AutowiredAnnotationBeanPostProcessor,流程基本相同,都会注册、实例化BeanPostProcessor对象,
在实例化对象完成后,设置属性值之前polulateBean之前,会搜集类上的注解元数据信息,然后在polulalteBean中拦截,执行
BeanPostProcessor中的方法,反射注入依赖的值。