spring的bean加载流程,循环依赖
一: 实例化一个applicationContext的对象创建一个beanFactory工厂对象
二: beanFactory的后置处理器对当前的所有类进行扫描
三: 使用for循环将所有的类通过一个beanDefintion对象进行解析和初始化默认参数, 并 且将实例化后的对象缓存到beanDefintionMap中
四: 再次调用beanFactory的后置处理器对beanDefintion对象进行一些额外的扩展, 比方 说用户自定义实现的一些参数属性方法
五: Spring首先从singletonObjects (一 级缓存)中尝试获取,如果获取到了直接return
六: 如果获取不到并且对象在创建中,则尝试从earlySingletonObjects(二级缓存)中获 取,如果获取到了直接return
七: 如果还是获取不到并且允许从singletonFactories通过getObject获取,则通过 singletonFactory.getObject()(三级缓存)获取,如果获取到了就从singletonFactories中移 除,并且放进earlySingletonObjects (二级缓存)中
八: 如果三个缓存中都拿不到对象, spring会经过一 系列的验证并且 确定类的构造方法 后,调用类的构造方法通过反射实例化一个对象, 也就是createBean
九: 中间会经过非常多的判断,其中最关键的两个点是 是否需要注入属性,是否需 要生成代理对象
十: spring将创建好的bean存入到一级缓存singletonObject中, 此时一个bean的初始化 完成,随时可以被引用,根据用户业务做一些相关的操作
十一: 最后是销毁,在上下文初始化失败时,所有已经创建好的bean会销毁,或者当用 户关闭容器时,bean也会被销毁。除此之外,用户也可以自行调用destroy-类的方法手 动销毁一个bean
1. 在创建Spring容器,也就是启动Spring时:
2. ⾸先会进⾏扫描,扫描得到所有的BeanDefinition对象,并存在⼀个Map中
3. 然后筛选出⾮懒加载的单例BeanDefinition进⾏创建Bean,对于多例Bean不需要在启动过程中去进⾏创建,对于多例Bean会在每次获取Bean时利⽤BeanDefinition去创建
4. 利⽤BeanDefinition创建Bean就是Bean的创建⽣命周期,这期间包括了合并BeanDefinition、推断构造⽅法、实例化、属性填充、初始化前、初始化、初始化后等步骤,其中AOP就是发⽣在初始化后这⼀步骤中
5. 单例Bean创建完了之后,Spring会发布⼀个容器启动事件
6. Spring启动结束
7. 在源码中会更复杂,⽐如源码中会提供⼀些模板⽅法,让⼦类来实现,⽐如源码中还涉及到⼀些
BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过
BenaFactoryPostProcessor来实现的,依赖注⼊就是通过BeanPostProcessor来实现的
8. 在Spring启动过程中还会去处理@Import等注解