1. Spring IOC是什么?
IOC就是invention of control,就是控制反转,将对象获取外界依赖资源的方式反转了。假设一个对象A依赖于对象B,在没有IOC以前,就是在对象A需要使用对象B时,去用代码显式地创建一个对象B。有了IOC以后,可以由Spring IOC容器来负责对象B的创建和销毁,创建后放在容器中,在对象A需要的时候再来取。 DI(Dependency Injection,依赖注入)其实就是IOC的另外一种说法,就是IOC是通过依赖注入技术实现的。
2. Spring怎么解决循环依赖问题?
Spring IOC 只能解决属性注入之间的循环依赖,如果是构造方法注入产生的循环依赖则直接会抛出BeanCurrentlyInCreationException异常
Spring 使用了三级缓存去解决循环依赖,也就是三个Map集合
- singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例,可以使用的。
- earlySingletonObjects 二级缓存,bean刚刚构造完成,但是还没有进行属性填充。
- singletonFactories 三级缓存,用于保存正在创建中的bean,以便于后面扩展有机会创建代理对象,此时的bean是没有完成属性填充的。
假设A类和B类相互依赖,A类中依赖属性B,B类中依赖属性A,Spring会先创建A类,将A放入三级缓存中,再去对A类的属性注入,发现需要依赖B类,则先去三个缓存中找B,找到直接引用,找不到就去创建B,将B放入三级缓存中,再去对B类的属性注入,发现需要依赖A类,则先去三个缓存中找A,发现在三级缓存中找到了A类,直接引用进行初始化B,完成后将B放入一级缓存中。B初始化完成后,将B从一级依赖中,填充到实例A,A可以进入到二级依赖,完全初始化完成后,A进入到一级依赖,供用户代码使用。
3. Spring Bean的生命周期?
Bean的生命周期主要分为一下四类
1.Bean的实例化阶段-主要是在createBeanInstance()方法中,调用类的构造器方法来创建一个Bean实例。用户可自定义一个类,继承InstantiationAwareBeanPostProcessorAdapter,重写它的两个方法,对Bean的实例化前后做一些额外的操作,例如打印日志。
2.属性赋值阶段-主要是在populateBean()方法中,对Bean的各项属性进行赋值。
3.Bean的初始化阶段-主要调用用户自定义的初始化方法init-Method()
用户可以自定义一个类,继承BeanPostProcessor,重写它的两个方法,对Bean的初始化前后做一些额外的操作,例如打印日志。
4.Bean销毁阶段,用户可以自定义destroyMethod()方法,在Bean被销毁时被调用。