IOC、AOP、动态代理、Spring事务、传播机制、隔离级别

IOC(基于反射)

  • IOC意思是控制反转,它将手动创建对象的控制权交给 Spring 来管理。载体是 IOC 容器,它是一个存放对象的 Map(key, value),当创建对象时,只需要配置好配置文件或注解即可,不用考虑对象是如何被创建的,从而把应用从复杂的依赖关系中解放了出来,降低了对象之间的耦合,增加了项目的可维护性,降低了开发难度。
  • IOC 容器的设计主要基于 BeanFactory 和 ApplicationContext 这两个接口,其中 BeanFactory 是最底层接口
  • Spring 的 IOC 有三种注入方式: 构造器注入、setter 方法注入、接口注入。

AOP(基于动态代理)

  • AOP意思是面向切面编程。它将那些与业务无关,却被业务模块共同调用的功能(比如事务处理、日志管理、权限控制等)进行了封装,在需要用到的地方之间使用即可,减少了重复代码,降低了模块间的耦合,有利于未来的扩展和维护。

Spring中的两种动态代理(JDK,CGLIB)

  • JDK 动态代理:必须借助接口才能产生代理对象。
  • CGLIB 动态代理:不需要接口就能实现动态代理。
  • 动态代理的含义:指的是在代码运行期间加载被代理的类。静态代理指的是,在代码编译时就确定了被代理的类。

Spring事务,声明式事务和编程式事务

  • 声明式事务:Spring通过Spring AOP框架来支持声明式事务管理,它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理,将事务管理作为横切关注点,通过aop方法模块化,本质是对方法前后进行拦截,然后在方法前加入一个事务,执行完方法后根据情况进行提交或回滚。它的优点是不需要通过编程的方式来管理事务,只需要在 xml 配置文件中声明事务即可。一般常用的有两种实现方式,一种是基于< tx> 和< aop>命名空间的方式在 xml 文件中灵活管理事务,代码侵入比较小,然后我们可以在里面设置事务的传播机制和隔离级别。另一种是使用 Transactional 注解的方式声明式的管理事务。
  • 编程式事务:通过Transaction Template手动管理事务,它将事务管理代码嵌到业务方法中来控制事务的提交和回滚。缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码,也就是代码入侵性会比较大。

事务的传播机制(7种)

  • 事务传播行为指的是某一个事务传播行为修饰的方法被嵌套进另一个方法中时,事务是如何传播的。
 public void methodA(){
    methodB();
    //doSomething
 }

 @Transaction(Propagation=XXX)
 public void methodB(){
    //doSomething
 }
  1. propagation_required(要求传播):如果当前没有事务,就新建一个事务;如果已经有事务了,就加入到这个事务中。这种传播行为是用的比较多的。
  2. propagation_supports(支持传播):支持当前事务,如果当前没有事务,就以非事务的方式执行。
  3. propagation_mandatory(强制传播):使用当前事务,如果当前没有事务,就抛出异常。
  4. propagation_requires_new(要求新的传播):新建事务,如果当前存在事务,就把当前事务挂起。
  5. propagation_not_supported(不支持传播):以非事务方式执行,如果当前存在事务,就把当前事务挂起。
  6. propagation_never(永不传播):以非事务方式执行,如果当前存在事务,就抛出异常。
  7. propagation_nested(嵌套传播):如果当前存在事务,就在嵌套事务内执行;如果当前没有事务,就执行和 propagation_required 一样的操作。

spring事务和数据库事务的区别

  • spring事务是对数据库事务的封装,比如spring事务在数据库事务的基础上添加了事务传播机制。但它最后本质的实现还是在数据库上,假如数据库不支持事务的话,spring事务是没有作用的,比如如果我们使用的mysql存储引起是MyISAM,那么配置的spring事务注解就不会起作用,因为MyISAM是不支持事务的,InnoDB存储引擎才支持事务。
  • 数据库事务有四种隔离级别,分别是读未提交、读已提交、可重复读、串行化。而spring事务还多了一个 default 隔离级别,它使用的是底层数据库默认的隔离级别,大部分数据库的默认隔离级别都是读已提交。

隔离级别

  • 读未提交: 指允许读取尚未提交的数据,是最低的隔离级别。会产生脏读、不可重复读和幻读。
  • 读已提交:指事务只能读到已经提交的数据。避免了脏读,但依然会产生不可重复读和幻读。
  • 可重复读:指同一个事务多次读取同一个数据,结果一致。避免了脏读和不可重复读,会产生幻读。它是mysql默认的隔离级别。
  • 串行化:指强制事务串行执行,隔离级别最高,并发性能最低。避免了脏读、不可重复读和幻读。

事务失效的场景

  1. Mysql使用的是不支持事务的 MyISAM 存储引擎。改为支持事务的 InnoDB 存储引擎即可。
  2. 在同一个类中,如果 a 方法使用 this 点的方式调用了 b 方法,那么不管 a 方法有没有开启事务,b 方法的事务都会是无效的。因为只有被动态代理直接掉用时才会产生事务,而this是真实对象而不是代理对象。解决方法是将 this 调用改为动态代理调用:AopContext.currentProxy()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值