Spring实例化流程:
源码中执行的是AbstractApplicationContext中的finishBeanFactoryInitialization方法进行实例化对象。
- 拿到将要实例化bean的BeanDefinition(拿到原料)
- 从单例池中尝试去拿这个bean的实例化对象。
- 如果拿不到,判断它是否标注了DependOn注解,如果标注了,就先去实例化DependOn里添加的bean
- 开始创建bean实体,如果有覆盖方法会先准备覆盖方法,实例化之前执行了InstantiationAwareBeanPostProcessor后置处理器的postProcessBeforeInstantiation方法,其实什么都没做,基本上都是返回空。
- 实例化对象,就是通过反射的方式,期间进行了各种适配,比如说使用哪些构造方法啊,有没有有参的构造方法呀,这样的。这一步之行了SmartInstantiationAwareBeanPostProcessor后置处理器
- 第三次执行MergedBeanDefinitionPostProcessor后置处理器
- 第四次执行SmartInstantiationAwareBeanPostProcessor后置处理器。为避免后期循环依赖,可以在bean初始化完成前将创建实例的ObjectFactory加入工厂对bean再一次依赖引用,主要应用SmartInstantiationAwareBeanPostProcesser其中我们所熟悉的AOP就是在这里将advice动态织入的,若没有直接返回bean不做任何处理
- 设置属性,非常重要,也就是自动装配执行了两次后置处理器第一次InstantiationAwareBeanPostProcessor,这个后置处理器一般返回为true,如果返回为false就表示不进行自动注入了。接下来又执行了一次InstantiationAwareBeanPostProcessor后置处理器的postProcessProperties方法进行自动注入。
- 初始化bean,invokeAwareMethods,首先会看是否实现了,Aware,BeanClassLoaderAware,BeanFactoryAware接口,如果实现和会注入相应的数据。比如说Aware对注入beanName,BeanClassLoaderAware会注入类加载器,BeanFactoryAware会注入工厂对象。
- 执行后置处理器BeanPostProcessor,我们可以在这里进行扩展和二次开发,只需要实现这个接口就行了。
- invokeInitMethods执行初始化方法还会执行实现了InitializingBean接口的方法。RequestMappingHandlerMapping就是在这里进行切入的。进行springmvc的一些配置。
- 在执行一次BeanPostProcessor后置处理器,执行postProcessAfterInitialization方法。
- 执行销毁方法。