@Resource注解的原理

1.CommonAnnotationBeanPostProcessor是主要逻辑类

2.CommonAnnotationBeanPostProcessor实现接口InstantiationAwareBeanPostProcessor

在bean的实例化过程中,执行populateBean方法中会调用InstantationAwareBeanPostProcessor的postProcessProperties方法

3.CommonAnnotationBeanPostProcessor还实现了MergedBeanDefinitionPostProcessor接口

在bean的实例化过程中,执行doCreateBean方法中会调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法,会填充RootBeanDefinition

4.底层调用逻辑

(1)如果指定@Resource中的name值,则调用beanFactory.getBean(String name,Class requiredType)

(2)如果不指定@Resource中的name值,则按字段名称在beanFactory中搜索存不存在相应的beanDefinition,

不存在则按类型查找,调用ListableBeanFactory的getBeanNamesForType()方法,存在多个则要去找@Primary标记的对象,否则报错NoUniqueBeanDefinitionException

存在,则就按字段名称依赖查询,调用beanFactory.getBean(String name,Class requiredType)

5.@PostConstruct,@PreDestory也是通过CommonAnnotationBeanPostProcessor实现的

你可能感兴趣的:(1024程序员节)