Java面试题———Spring篇②

目录

一,Spring的通知类型有哪些

二,了解Spring的事务管理吗

三,Spring事务传播行为有几种

四,Spring中的事务是如何实现的

五,Spring中的设计模式有哪些

六,Spring是怎么解决循环依赖的(待整理)


一,Spring的通知类型有哪些

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用五种类型的通知:

  1. 前置通知:在某切点之前执行的通知

  2. 返回后通知:在某切点正常完成后执行的通知

  3. 抛出异常后通知:在某切点抛出异常退出时执行的通知

  4. 后置通知:在某切点退出的时候执行的通知(不论是正常返回还是异常退出)

  5. 环绕通知:包围一个切点的通知

二,了解Spring的事务管理吗

嗯,了解的,Spring支持编程式事务和声明式事务

  • 第一种是编程式事务指的是在代码中使用try-catch捕获异常,然后配合事务的api来手动处理事务问题

    这种方式的缺点是代码耦合,复用性低,优点是可以精确控制要增强的代码(不仅仅限于方法粒度)

  • 第二种是声明式事务,声明式事务是AOP思想的一种应用,它的核心思想是将业务方法作为切点,

    将事务处理方法作为增强,通过动态代理实现事务的管理,它的优点是降低代码耦合,提供复用

目前在企业中基本上都是采用声明式事务的。

三,Spring事务传播行为有几种

事务传播行为是为了解决业务层方法之间互相调用的事务问题。

当事务方法被另一事务方法调用时,必须指定事务应该如何传播。

例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

Spring支持7个种事务传播行为的:

  1. 必须事务:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务

  2. 必须新事务:创建一个新的事务,如果当前存在事务,则把当前事务挂起

  3. 强制事务:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常

  4. 支持事务:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行

  5. 不支持事务:以非事务方式运行,如果当前存在事务,则把当前事务挂起

  6. 强制无事务:以非事务方式运行,如果当前存在事务,则抛出异常

  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 容器解决循环依赖的思路:

  1. 初始化 Bean 之前,将这个 BeanName 放入三级缓存

  2. 创建 Bean 将准备创建的 Bean 放入 singletonsCurrentlyInCreation (正在创建的 Bean)

  3. createNewInstance 方法执行完后执行 addSingletonFactory,将这个实例化但没有属性赋值的 Bean 放入二级缓存,并从三级缓存中移除

  4. 属性赋值&自动注入时,引发关联创建

  5. 关联创建时,检查“正在被创建的 Bean”中是否有即将注入的 Bean。如果有,检查二级缓存中是否有当前创建好但没有赋值初始化的 Bean。如果没有,检查三级缓存中是否有!正在创建中的 Bean。至此一般会有,将这个 Bean 放入二级缓存,并从三级缓存中移除

  6. 之后 Bean 被成功注入,最后执行 addSingleton,将这个完全创建好的 Bean 放入一级缓存,从二级缓存和三级缓存移除,并记录已经创建了的单实例 Bean

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵薯条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值