目录
一,Spring的通知类型有哪些
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
前置通知:在某切点之前执行的通知
返回后通知:在某切点正常完成后执行的通知
抛出异常后通知:在某切点抛出异常退出时执行的通知
后置通知:在某切点退出的时候执行的通知(不论是正常返回还是异常退出)
环绕通知:包围一个切点的通知
二,了解Spring的事务管理吗
嗯,了解的,Spring支持编程式事务和声明式事务
第一种是编程式事务指的是在代码中使用try-catch捕获异常,然后配合事务的api来手动处理事务问题
这种方式的缺点是代码耦合,复用性低,优点是可以精确控制要增强的代码(不仅仅限于方法粒度)
第二种是声明式事务,声明式事务是AOP思想的一种应用,它的核心思想是将业务方法作为切点,
将事务处理方法作为增强,通过动态代理实现事务的管理,它的优点是降低代码耦合,提供复用
目前在企业中基本上都是采用声明式事务的。
三,Spring事务传播行为有几种
事务传播行为是为了解决业务层方法之间互相调用的事务问题。
当事务方法被另一事务方法调用时,必须指定事务应该如何传播。
例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
Spring支持7个种事务传播行为的:
必须事务:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
必须新事务:创建一个新的事务,如果当前存在事务,则把当前事务挂起
强制事务:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
支持事务:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
不支持事务:以非事务方式运行,如果当前存在事务,则把当前事务挂起
强制无事务:以非事务方式运行,如果当前存在事务,则抛出异常
嵌套事务:如果当前存在事务,则创建一个当前事务的嵌套事务来运行;如果当前没有事务,则创建一个事务
嵌套事务是已存在事务的一个子事务,嵌套事务开始执行时,将取得一个保存点,
如果这个嵌套事务失败,将回滚到此保存点
嵌套事务是外部事务的一部分,只有外部事务结束后它才会被提交
四,Spring中的事务是如何实现的
Spring事务底层是基于数据库事务和AOP机制的
首先Spring会为使用了@Transactional注解的Bean代理对象,当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解。如果加了,那么则利用事务管理器创建一个数据库连接,并且禁止此连接的自动提交事务 然后执行当前方法,方法中会执行sql ,执行完当前方法后,如果没有出现异常就直接提交事务;如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务。
Spring事务的隔离级别对应的就是数据库的隔离级别 ,Spring事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为 需要新开一个事务,那么实际上就是重新建立一个数据库连接,在此新数据库连接上执⾏sql
五,Spring中的设计模式有哪些
工厂模式:Spring使用工厂模式通过 BeanFactory和 ApplicationContext创建 bean 对象
单例模式: Spring 中的 bean 默认都是单例的
代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术
模板方法:用来解决代码重复的问题。比如 RestTemplate、jdbcTemplate、 JpaTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如 Spring 中 listener 的实现 ApplicationListener。
六,Spring是怎么解决循环依赖的(待整理)
整个IOC容器解决循环依赖,用到的几个重要成员:
singletonObjects:一级缓存,存放完全初始化好的 Bean 的集合,从这个集合中取出来的 Bean 可以立马返回 earlySingletonObjects:二级缓存,存放创建好但没有初始化属性的 Bean 的集合,它用来解决循环依赖 singletonFactories:三级缓存,存放单实例 Bean 工厂的集合 singletonsCurrentlyInCreation:存放正在被创建的 Bean 的集合
IOC 容器解决循环依赖的思路:
初始化 Bean 之前,将这个 BeanName 放入三级缓存
创建 Bean 将准备创建的 Bean 放入 singletonsCurrentlyInCreation (正在创建的 Bean)
createNewInstance 方法执行完后执行 addSingletonFactory,将这个实例化但没有属性赋值的 Bean 放入二级缓存,并从三级缓存中移除
属性赋值&自动注入时,引发关联创建
关联创建时,检查“正在被创建的 Bean”中是否有即将注入的 Bean。如果有,检查二级缓存中是否有当前创建好但没有赋值初始化的 Bean。如果没有,检查三级缓存中是否有!正在创建中的 Bean。至此一般会有,将这个 Bean 放入二级缓存,并从三级缓存中移除
之后 Bean 被成功注入,最后执行 addSingleton,将这个完全创建好的 Bean 放入一级缓存,从二级缓存和三级缓存移除,并记录已经创建了的单实例 Bean