1.什么是ioc容器
ioc容器是用来存放spring中创建的对象,在这里涉及到spring是如何启动ioc容器,怎么生成bean的。
(1)配置元数据,比如我们的xml配置文件,properties配置文件,或者注解
(2)spring读取配置文件需要用到xmlbeandefinition,或者propertiesbeandefinition,或者annotedbeandefinition,通过这些读取之后会统一生成一个叫beandefinition的对象存在于内存中,
(3)生成的对象通过对应一个唯一的id注册到beandefinitionregister里面,移键值对的形式存在
(4)这里还有一个beanfactorypostprocessor处理器,主要是用来替换属性,修改等操作,例如配置的DataSource里面的${username}等属性信息
以上就完成了ioc容器的启动
2.bean的生命周期
ioc容器启动之后,bean的对象创建就开始了,这里就涉及到了bena的生命周期
(1)bean对象额创建,通过反射形式创建bean对象。这里用到了spring的策略设计模式
(2)为了统一对象的管理,spring使用了beanwrapper进行了封装,这里主要是对这个对象进行属性的赋值,setter注入的方式。这里有一个spring解决的经典问题,就是spring是如何解决循环依赖的。为什么spring只能解决setter注入的循环依赖,而不能解决构造的循环依赖。我们看一下循环依赖的解决方式吧。
1> 循环依赖的生成,就是A对象引用B对象,而B对象又引用A对象,关键是两个对象都没有生成,导致陷入了循环之中。
2>spring的解决的方式是,引用了三级缓存。一级缓存主要是保存已经创建好的完整的对象,这里的熟悉已经被赋值。二级缓存主要是保存一个提前暴露的对象,这里的属性还没有被赋值,二级缓存主要用于解决循环依赖问题。三级缓存主要是保存代理的对象,即循环依赖的是动态代理创建的对象,我们这里就会使用到三级缓存。
(3)属性注入之后,就是aware的检查,包括applicationcontext容器,beanfactory等等很多的扩展类
(4)然后就是beanpostprocessor,这个主要是用来增强,扩展bean实例的,例如springAop
(5) 之后就是自定义的初始化逻辑,例如initializingbean
(6)spring最后还我们留了一个后置处理器,跟前置处理器类型,也是用来增强,修改bean实例
(7)后置处理器执行完成后,就是自定义的销毁逻辑的destory,如配置bean中的DataSource对应的close方法。
(8)以上步骤都执行完成之后,就可以使用我们的对象了
(9)使用完成之后就是销毁对象
这就是bean的生命周期,简略写了一下。