接上一節看一下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中的方法,反射注入依賴的值。