综述
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。
使用5.2.9版本spring学习,实际我用的5.3.3。spring是springboot和springcloud的基础,只有看懂spring源码才能看懂其他2个。spring 的扩展性很强,一个接口可能实现了几十上百个类,所以需要抓住主线脉络梳理;
spring核心就2个,IOC和AOP,但必须先搞懂IOC。IOC是控制反转思想,DI是依赖注入的实现手段。
之前都是xml中配置bean对象,然后通过方法解析xml,最后getBean方法获得对象,过程中是怎么做的?
如下图所示,这就是住脉络,同时每个步骤中有很多的拓展以增强当前步骤,也就是有很多类方法,看着很复杂。
下图是,容器中使用Map存储对象信息,getBean方法获得对象就很适合这个数据结构。有4种存储对象方式,第三种涉及三级缓存,这个会解决循环依赖问题,后续讲。
解析xml
beanDefinitionReader接口是拓展定义规范的。
上图中使用反射实例化对象,是为了更灵活方便,能拿到类的所有信息。
涉及反射,spring bean有4个scope,分别是是默认的singleton,prototype,request,session。
下图是创建Class对象方式
一定要知道的3个类,看源码经常出现
SpringIOC原理
1、创建BeanFactory, DefaultListableBeanFactory
2、加载配置文件,将配置文件的信息通过BeanDefinitionReader读取为BeanDefinition信息对象
3、然后通过BeanPostProcessor的一系列后置增强处理,常用的是PlaceHolderPostProcessor(替换占位符)
4、再通过反射的方式将BeanDefinition实例化为bean对象,这个时候仅仅是在堆中开辟了一个内存空间,对象的属性值都是默认的
5、再将bean对象进行初始化,(属性赋值、处理Aware回调、beanPostProcessor的前置处理(beafore)、处理init-method的方法、处理beanPostProcessor的后置处理(after))
6、初始化完成,得到一个完整的bean,放入到容器中,供容器后续的使用getBean();
7、最终关闭容器,销毁bean对象