在学习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、多线程调用

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐