Spring 核心八股(必背)
在学习Spring八股之前,我们需要先了解一下Spring的核心内容有哪些
Spring的核心为:AOP,IOC(控制反转), Bean相关,事务
IOC相关
什么是IOC?
IOC(控制反转)就是一种设计思想,控制是控制的对象创建的过程,反转是是反转创建对象的主体,原本是需要我们程序员手动去创建对象,但是现在不需要了,核心就是对象的创还能和依赖关系不用自己手动去new,直接交给容器管理就行
由容器创建出来的bean是单例的吗?会不会有线程安全
bean为单例的意思就是在在Spring的IOC容器中只会有该类的一个对象,Bean对象只有一个的话就避免的对象的频繁创建与销毁,达到了高可用
bean默认是单例的,可以通过scope属性进行修改单例或者多例
因为它是单例的bean,如果是有状态的对象,也就是说他可以存储数据,所有线程共用一个bean对象,所以会有线程安全,如果是无状态的对象,那就不会存在线程安全
Bean的生命周期是什么?
这里放一张黑马的图
生命周期就是bean从创建到销毁的一系列过程
1、Spring通过反射调用构造函数创建bean对象
2、属性注入:把bean内部的属性填充完成,进行依赖注入
3、处理Aware接口,如果bean实现了以Aware结尾的接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware),他会把对应的信息注入引来
4、进行BeanPostProcessor前置处理
5、初始化方法,比如@PostConstruct注解方法,init-method
6、BeanPostProcesson后置处理,AOP就是在这一步进行创建的
7、最终bean进入可用的状态
8、在容器关闭时执行销毁方法

什么是循环依赖?三级缓存?
就是有多个Bean相互引用,形成了一个闭环,比如说A依赖于B,B依赖于A
Spring框架可以通过三级缓存解决循环依赖
一级缓存:单例池,放入已经初始化完成的Bean对象
二级缓存:放的是半成品,已经实例化但是还没有填充属性的bean
三级缓存,这里是对象工厂,用来创建某个对象的
假如A和B相互依赖
Spring先把A new出来,这时候A还是个空壳子
然后把一个能获取A的工厂放到三级缓存里
A开始填充属性,发现需要B,然后去创建B
把B也创建出来后,同样把工厂放入三级缓存,开始填充属性,发现需要A
然后先从一级缓存找,然后找二级缓存,最后从三级缓存找到
B拿到A的工厂,创建代理对象
然后然后把这个代理对象放入二级缓存,并把三级缓存中的工厂删掉
最后B拿到了A,B创建完成放入一级缓存,A拿到B,A也创建完成,放入一级缓存
为什么需要三级缓存?二级缓存不够吗?
如果只是解决循环依赖,那么二级缓存是够用的,但是二级缓存他存储的是原始对象,如果他需要aop代理,那么他只能拿到最原始的对象,导致aop失败,如果他不需要aop的话,二级缓存是足够的,如果他需要aop,就需要三级缓存,在需要代理的时候生成代理对象
AOP
AOP的原理
AOP就是面向切面编程,他就是把一些通用的逻辑抽取出来,减少了重复代码,而且是非侵入式的,不会破坏原本代码
他有前置通知,后置通知,环绕通知
它调用方法调用的是代理对象,代理对象通过拦截方法,执行前置通知,然后再执行代理目标对象的真是方法,方法执行完成之后,在执行后置通知
一般像记录日志,spring的事务都是用AOP实现的
事务失效的场景?
首先因为事务是基于AOP实现的,如果他没有走到AOP代理对象,那么他就会失效
1、rollbackFor没有进行设置对,他默认只能捕获RuntimeException的异常
2、异常被捕获了,但是没有抛出
3、同一个类内部调用,
4、方法不是public
5、方法是final或者static
6、数据库不支持
7、没有被Spring管理
8、多线程调用
更多推荐



所有评论(0)