Spring @Autowired注入过程
Spring @Autowired注入过程
@Autowired的具体实现可以参照spring framework进行更详细的探索,目前可以确定的大致流程为:@Autowired的类实现结构为
顶层接口都是实现的BeanPostProcessor。
注:BeanFactoryPostProcessor当所有bean定义都将被加载但尚未实例化任何bean时,将调用bean实现。这甚至可以覆盖或添加属性,甚至可以用于初始化bean。这将使你可以访问以XML定义或已注释(通过component-scan扫描)的所有bean。
Bean实现BeanPostProcessor对Bean(或对象)实例进行操作,这意味着当Spring IoC容器实例化Bean实例时,BeanPostProcessor接口将完成其工作。
BeanFactoryPostProcessor在所有上下文定义都将被加载之后,在Spring上下文启动期间“实现” BeanPostProcessor被“调用”,而在Spring IoC容器实例化一个bean时(即在所有单例启动时以及根据原型的需求启动时)“调用”实现。
在spring的启动过程中,刷新上下文(refresh)的时候,会调用registerBeanPostProcessors(beanFactory)方法完成BeanPostProcessor的实例化与注册,后续再调用finishBeanFactoryInitialization(beanFactory)实例化非延迟加载的单例bean时,会用到上述注册的BeanPostProcessor。具体的实现在
该类会读取bean的field和method上的注解,并判断该注解是否在autowiredAnnotationTypes中,如果在则将field封装成AutowiredFiledElement对象、将method封装成AutoWiredMethodElement对象,并存放到InjectionMetadata对象的Set
bean的创建与初始化
(1)instanceWrapper = createBeanInstance(beanName, mbd, args) 创建目标bean实例;
(2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName) 寻找目标bean的依赖;
(3)populateBean(beanName, mbd, instanceWrapper) 填充目标bean,完成依赖注入; (这里的循环依赖,有兴趣的可以自行去琢磨下)
(4)initializeBean(beanName, exposedObject, mbd) 初始化目标bean
自动装配与自动配置
自动配置一般而言说的是spring的@Autowired,是spring的特性之一,而自动配置是springboot的@Configuration,是springboot的特性之一(有待进一步补充)