你不知道的Spring

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被销毁时被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值