Spring中的IOC和AOP、事务传播行为、MVC

什么是Spring:

Spring是一个开源的,轻量级的IOC和AOP容器框架,简化了开发流程,方便了对其他框架的整合

控制反转(Inversion Of Controll):

将相互依赖对象的创建和协调工作都交由IOC容器来完成,当某个对象需要其他协作对象时,由IOC通过依赖注入(DI, Dependency Injection)的方式提供协作对象,达到只需要关注业务本身逻辑的目的。

面向切面编程(Aspect Oriented Programming):

效果:分离系统中的各种关注点,进一步解耦模块间的相互依赖,提高模块的重用性

应用场景:权限认证、日志、事务、全局事务处理等,几乎业务功能都需要的功能

Spring AOP自动选择JDK动态代理和CGLIB动态代理:

JDK动态代理需要类实现接口,重写类InvocationHandler中的invok方法,来调度目标对象的方法;

CGLIB动态代理在运行时动态的生成某个类的子类(如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的),重写接口MethodInterceptor中的intercept方法,来调度目标对象的方法。

AOP:http://www.importnew.com/24305.html

使用AOP方式实现系读写分离

代理模式

Spring中基于AspectJ的AOP开发:

通过Pointcut定义表达式拦截指定的Joinpoint,再使用Advice在指定的位置增强。
在这里插入图片描述

Spring中的事务:

Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务。

Spring中有声明式和编程式(淘汰)事务,声明式事务是基于Spring AOP方式实现的

声明式事务隔离级别:

较SQL标准的四种隔离级别多一个,为使用数据库默认的隔离级别(isolation_default)。(事务隔离参考:https://blog.csdn.net/BigBug_500/article/details/89452904)

声明式事务传播特性:

传播特性是Spring在当前线程内,处理多个 数据库操作方法事务时 所做的一种事务应用策略,且作用于内层的方法上(多个方法的嵌套调用,最外层方法不存在传播)。

Spring提供的事务七大传播方式:

  1. propagation_required(必须的,默认): 如果外层事务不存在,内层就主动开启事务;否则使用外层事务

  2. propagation_supports(支持) : 如果外层事务不存在,就不使用事务;否则使用外层事务

  3. propagation_mandatory(强制) : 如果外层事务不存在,就抛出异常;否则使用外层事务

  4. propagation_requires_new(必须要新的) : 总是开启一个新事务;如果存在外层事务,就将外层事务挂起

  5. propagation_not_supported(不支持) : 总是不开启事务;如果存在外层事务,就将外层事务挂起

  6. propagation_never(从不) :总是不使用事务;如果存在外层事务,就抛出异常。与mandatory相反

  7. propagation_nested(嵌套) :如果外层事务不存在,就主动创建事务;否则创建嵌套的子事务。外层事务若回滚,会带着子事务一同回滚;子事务若回滚,则到 savepoint (即 刚进入 子事务的暂存点),不会影响到外层事务

不同传播特性间的对比:

nested 与 required 外层事务不存在,都会主动创建事务,那他们两者有什么区别?
   required 外内层方法使用的是同一个事务,只要发生异常,外内层都要回滚;nested 内层使用的是外层的子事务,发生异常回滚时,要视情况而定(如上7中解释)。

nested 与 requires_new 在内层事务异常回滚时,都不会影响到外层事务,那他们两者有什么区别?
  nested使用的是外层事务的子事务,回滚时,会回到对应的 savepoint ,且外层事务的回滚会带动嵌套内层事务回滚;requires_new的外内层使用的是两个独立的事务,内层事务的操作,不会影响外层事务。

事务传播特性的代码用例

Spring MVC与Boot:

是基于 Servlet 的一个 MVC 框架,主要解决 WEB 开发的问题,其具体执行过程可参考:https://blog.csdn.net/BigBug_500/article/details/89604300。

由于配置繁琐,每次项目的配置都大同小异等问题,于是出现Spring Boot自动配置的概念。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,但集成了大量常用的第三方库配置,所以只需要极少量的配置代码。

发布了91 篇原创文章 · 获赞 54 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/BigBug_500/article/details/103275603