Spring @Autowired注入过程

Spring @Autowired注入过程

@Autowired的具体实现可以参照spring framework进行更详细的探索,目前可以确定的大致流程为:@Autowired的类实现结构为
265c231e4b9ebcf6212e91a735352e5.png
顶层接口都是实现的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。具体的实现在

969e5c7d1a60e0aceedf7834d7253a3.png

该类会读取bean的field和method上的注解,并判断该注解是否在autowiredAnnotationTypes中,如果在则将field封装成AutowiredFiledElement对象、将method封装成AutoWiredMethodElement对象,并存放到InjectionMetadata对象的Set checkedElements属性中,最后将该InjectionMetadata对象缓存到了AutowiredAnnotationBeanPostProcessor的Map<String, InjectionMetadata> injectionMetadataCache属性中;说白了就是将bean中被@Autowried(当然还包括@Value、@Inject)修饰的field、method找出来,封装成InjectionMetadata对象并缓存起来

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的特性之一(有待进一步补充)