一、谈下对Spring IOC的理解?
IOC :控制反转,原来由使用者自己创建的对象,将对象的实例化和初始化交给容器帮开发人员实现。通过依赖注入将属性注入到具体的对象当中。 它是我们常说的spring容器,存储对象,在spring中存储对象的时候一般有三级缓存,singletonObjects存放完成的对象,earlySingletonObjects存放半成品对象,singletonFactory用来存放lambda表达式和对象名称的映射,整个spring的生命周期,从创建到使用再到销毁,各个环节都是由容器来帮开发者实现。 。二、spring容器的生命周期
spring 帮助开发人员管理对象,从对象的产生到销毁环节都由容器来控制,其中主要包含实例化和初始化关键环节,其中还包含一些spring预留的一些扩展点。- 实例化bean对象,通过反射的方式生成,在源码中通过createBeanInstance方法来实例化对象;
- 当bean对象创建完成之后,对象的属性值都是默认值,开始对bean的属性进行填充,通过populateBean方法完成对象属性的填充,这里可能会涉及到循环依赖的问题,spring主要通过三级缓存解决该问题;
- 向bean对象中设置容器对象属性,会调用invokeAwareMethods方法来将容器对象设置到具体的bean对象中;
- 调用BeanPostprocessor中的前置过滤器方法来进行bean对象的扩展工作,applicationContextPostProcessor,EmbeddValueResolver等对象;
- 调用invokeInitMethods方法来完成初始化对象方法的调用,如果实现了InitiallizingBean接口,则调用afterPropertiesSet方法来最后设置bean对象;
- 调用BeanPostProcessor后置处理器,完成对Bean对象的后置处理工作,aop就在该处实现,实现的接口名字叫做AbstractAutoProxyCreator;
- 获取到完整对象,通过getBean的方式去进行对象的获取和使用;
- 当对象使用完成之后,容器在关闭的时候,会进行对象销毁,首先会判断是否实现了DispoableBean接口,然后调用destroryMethod方法。
三、BeanFactory和FactoryBean
BeanFactory和FactoryBean都可以用来创建对象,只不过创建的流程和方式不通过。- BeanFactory必须严格的遵守对象的创建流程,经过一些列的复杂步骤之后才可以创建出单例对象;
- FactoryBean 用户可以自定义bean对象的创建流程,一般用来处理有复杂逻辑的bean,包含三个方法,
-
isSingleton 是否是单例对象;
-
getObjectType 获取对象类型
-
getObject 此方法中可以自己创建对象,使用new的方式或者使用代理的方式,自定义去创建对象。
四、循环依赖为什么需要三级缓存
-
只有一级缓存是否可行?
不行,之所以至少需要两级缓存,是因为半成品对象无法暴漏给外部直接使用,所以需要将成品和半成品区分开来,一级缓存存放成品对象,二级缓存放半成品对象。 -
只有二级缓存是否可行?
如果整个spring中不涉及aop存在,那二级缓存足以解决循环依赖问题,如果aop存在就需要使用三级缓存。 -
为什么使用三级缓存?
三级缓存的value是ObjectFactory,是一个函数式接口,不是直接进行调用的,只有在调用getObject方法时才会去调用里面存储的lambda表达式,存在意义就是保证在整个容器的运行过程中同名的bean对象只能有一个。
当创建出代理对象之后,会同时存在代理对象和普通对象,究竟应该如何选择哪个对象呢?
当需要代理对象的时候,会用代理生成的对象覆盖原始对象。