1、ioc容器的初始化过程
1、实例化一个ApplicationContext对象
2、解析 xml配置文件路径
3、创建bean工厂
4、创建bean定义,保存到beanDefinitonMap,用于后期的bean实例化
5、调用bean工厂的后置处理器,可自定义修改bean定义
invokeBeanFactoryPostProcessors(beanFactory)
6、判断beanDefiniton是否符合生产标准(是不是抽象的,单例,懒加载)
preInstantiateSingletons()方法
7、doGetBean()方法生产bean
去单例池中获取看bean是否已经创建,如果没有创建则需要重新创建
为了解决循环依赖的问题,会将当前bean加入到正在创建的标识中singletonsCurrentlyInCreation
8、调用bean的后置处理器,可直接返回bean实例,拦截spring帮助我们创建bean的行为
resolveBeforeInstantiation(beanName, mbdToUse)
9、调用doCreateBean()开始创建bean
10、实例化bean,createBeanInstance()负责创建
通过工厂方法、Supplier、Bean后置处理器:SmartInstantiationAwareBeanPostProcessor .determineCandidateConstructors方法、beanDefiniton的ConstructorArgumentValues,默认使用无参构造函数来实例化
11、populateBean注入属性值
12、初始化bean
调用Aware、调用@PostConstrut、AOP的动态代理也是在初始化完进行生成的