框架源码专题-Spring-10、
1. 注册 BPP 的 BD
2. 创建 BPP Bean
在 refresh () 的 6. registerBeanPostProcessors ()
,将所有 BeanPostProcessor 注册到容器中。注意:只是注册但并未执行
3. 预解析
❕
在 refresh () 的 11. finishBeanFactoryInitialization()
,在实例化之后属性赋值之前,在 MergedBeanDefinitionPostProcessor
的子实现接口 AutowiredAnnotationBeanPostProcessor
的 postProcessMergedBeanDefinition
方法中,解析@ Autowired@Value 转换 InjectionMetadata 并缓存在 injectionMetadataCache
中
findAutowiringMetadata -> buildAutowiringMetadata ->
findAutowiredAnnotation-> ==List<InjectionMetadata.InjectedElement>==.add(new AutowiredFieldElement(field, required)) ❕
[[pages/002-schdule/001-Arch/001-Subject/013-DemoCode/lianpengju/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java]]
4. 自动装配
在 refresh () 的 11. finishBeanFactoryInitialization()
中,applyPropertyValues
真正赋值之前,在 InstantiationAwareBeanPostProcessor
的子实现接口 AutowiredAnnotationBeanPostProcessor
的 () postProcessPropertyValues
postProcessProperties
方法中完成 bean 中@Autowired,@Inject,@Value 注解的解析并注入:
但我们发现被废弃的方法
postProcessPropertyValues
并没有被执行,这个方法是完全没有被使用了吗?其实不是的,当postProcessProperties
方法的返回值为null
时,被废弃的方法postProcessPropertyValues
就会被执行。
postProcessProperties->findAutowiringMetadata->metadata.inject(bean, beanName, pvs)->beanFactory.resolveDependency
- 获取依赖的 value 值的工作最终还是委托给
beanFactory.resolveDependency()
去完成的 - 这个接口方法由 AutowireCapableBeanFactory 提供,它提供了从 bean 工厂里获取依赖值的能力
- resolveDependency 方法根据 descriptor 的依赖类型解析出与 descriptor 所包装的对象匹配的候选 Bean 对象
❕
beanFactory.resolveDependency
根据 descriptor 的依赖类型解析出与 descriptor 所包装的对象匹配的候选 Bean 对象 ^ac1rnt
当容器扫描到@Autowied、@Resource 或@Inject 时,就会在 IOC 容器自动查找需要的 bean,并装配给该对象的属性。在使用@Autowired 时,首先在容器中查询对应类型的 bean:
如果查询结果刚好为一个,就将该 bean 装配给@Autowired 指定的数据;
如果查询的结果不止一个,那么@Autowired 会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用 required=false。
❕