1.Bean加载过程
Step 1:尝试从缓存中获取Bean实例(从singletonFactory获取,即singletonFactory.getObject()方法)
singletonObjects:BeanName和bean实例之间的关系
singletonFacories:BeanName和bean工厂之间的关系
earlySingletonObjects:创建过程中的Bean,即创建过程BeanName和bean实例之间的关系
Step 2:若Step 1获取成功,则检测用户想返回的Bean实例是否是工厂Bean,若是直接返回,否则,需要从工厂Bean中获取Bean实例(调用factory.getObject();方法返回Bean实例,调用完成后调用postProcessAfterInitialization方法)
Step 3:若Step 1获取失败,则新建Bean创建过程见下
Step 4:检测新建的Bean实例是否是工厂Bean,若是直接返回,否则,需要从工厂Bean中获取Bean实例(调用factory.getObject();方法返回Bean实例,调用完成后调用postProcessAfterInitialization方法)
Step 5:加载完成
2.Bean创建过程
Step 1:验证及准备覆盖的方法
覆盖方法从AbstractBeanDefinition类中的属性获取,即在解析spring配置文件时,把lookup-method和replace-method放到该类的属性中
private MethodOverrides methodOverrides = new MethodOverrides();
Step 2:实例化的前置处理。即调用实现了BeanPostProcessor接口的类中的postProcessBeforeInstantiation方法,若返回的Bean已经初始化,则调用实现了BeanPostProcessor接口的类中的postProcessAfterInstantiation方法,创建Bean结束,否则进入Step 3.
Step 3:若工厂方法不为空则使用工厂方法初始化(即Bean标签中的factory-method属性),否则解析构造函数并进行构造函数的实例化。
实例化结合了反射(没有使用replace和lookup方法)和代理(使用了replace和lookup方法)方式对Bean进行实例化
Step 4:若单例Bean且在创建中,需要把该单例工厂暴露出来(解决单例的循环依赖)
Step 5:属性填充
Step 6:初始化Bean
对特殊Bean的处理,如BeanFactoryAware、BeanNameAware、ApplicationContextAware
等等
实现BeanPostProcessor接口调用postProcessBeforeInstantiation方法
如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化方法。
实现BeanPostProcessor接口调用postProcessAfterInstantiation方法
注册销毁方法,如destroy-method方法