Spring的aop,aop的意思是:面向切面编程,而在Sprin中的Aop具体来说是在不动原始类中的方法的情况下,给其中的方法做增强功能。

spring amqp事务 spring事务和aop_数据

   

 

连接点就是原始类中所有的方法,切入点是原始类中需要做增强的方法,也就是需要和Spring绑定的方法,通知就是需要做的增强的功能,也就是切入点执行的操作,切面就是描述同志爱和切入点之间的关系(是after还是before还是around)

 

spring amqp事务 spring事务和aop_回滚_02

 

 然后这个aop是怎么实现的呢

首先需要导入相关坐标

spring amqp事务 spring事务和aop_事务管理_03

 

 

,然后在SpringConfig上面写上一个@EnableAspect,,注解,告诉这个SpringConfig类要加载这个aop的通知类

spring amqp事务 spring事务和aop_spring amqp事务_04

 

 然后就是写通知类:

随便起个名字即可,然后其中的随便写个方法,例如private void pt(){},

spring amqp事务 spring事务和aop_回滚_05

 

 

关键在于上面的注解,注解后面有一行内容,就是切入点表达式,用来描述切入点的,就是那个包下的那个类中的那个方法要作为切入点,描述方式有两种一种是写接口中的,另一种是写实现类中的,但是为了减低代码的耦合性所以,就选用第一种方法

spring amqp事务 spring事务和aop_数据_06

 

 然后这个表达式的里面的具体代表些什么东西呢?有动作关键字,访问修饰符,返回值类型,包,类,方法等等。。。

spring amqp事务 spring事务和aop_数据_07

 

 然后可以使用*通配符,这样可以快速匹配到切入点,

spring amqp事务 spring事务和aop_事务管理_08

 

 比如说这个切入点表达式就代表,任意返回类型,com.itheima下任意包下以Service结尾的任意类下的,以find开头的任意方法,参数任意

spring amqp事务 spring事务和aop_数据_09

 

 这个切入点表达式写的话也有一些默认的便于阅读的方式,也就是一些技巧:

 

spring amqp事务 spring事务和aop_事务管理_10

 

 

写完切入点之后需要写一个方法,方法里面就写通知,也就是需要增强的功能,然后再通知上需写上一个注解,注解里面写上那个切点的方法,这个注解就表名这个切入点与属性的关系,是前置还是后置,还是环绕,相当于把切入点与通知绑定起来,也就是搞成了切面。

这个注几种类型,也就代表通知有几种类型:前置,后置,环绕,返回,抛出异常。

spring amqp事务 spring事务和aop_spring amqp事务_11

 

然后在这个通知中可以获得一些数据,这些数据包括:或去参数,返回值,异常。

spring amqp事务 spring事务和aop_数据_12

 

 

 

 

重点需要知道环绕通知,环绕通知里面,需要一个ProceedingJoinPoint 创建的对象来调用这个proceed()这个方法,因为如果不调用这个方法,那么原始类中的方法不会执行,而只会执行这个通知中的方法,也就是增强的功能。有的原始方法,他是有返回值类型的,所以我定义方法的返回类型为Object,然后再return这个结果“ret”

spring amqp事务 spring事务和aop_事务管理_13

 

 再说一下这个aop得工作流程吧,Spring容器启动后,先读取所有切面配置中的切入点,然后初始化bean,判定bean对应的类中方法是匹配到任意切入点,也就是比对是否有这个切入点一样的方法,如果有那就创建原始对象的代理对象,执行原始方法和增强方法,如果没有也就是匹配失败,那就创建原始对象,执行原始方法。

spring amqp事务 spring事务和aop_spring amqp事务_14

 

 

spring amqp事务 spring事务和aop_spring amqp事务_15

 

通知获取的数据::;

 

spring amqp事务 spring事务和aop_回滚_16

 

 

 

具体用例如下:

 

spring amqp事务 spring事务和aop_回滚_17

 

 

 

 

 

 

 然后可以可以根据这个ProceedingJoinPoint对象来改原始类中的参数,从而影响原始方法的执行:(百度网盘去空格操作)

spring amqp事务 spring事务和aop_spring amqp事务_18

 

 

 

改完这个args后再重新把他传给proceed方法也就是原始方法执行。

  然后Spring事务就是把,那个很多操作,可以化为一个事务,也可以化为多个事务,便于事务回滚与提交:

spring amqp事务 spring事务和aop_回滚_19

 

 

 这个Spring事务开启主要有三步:

首先在业务层接口添加Spring事务管理注释:@Transation

spring amqp事务 spring事务和aop_数据_20

 

 

 然后设置事务管理器:注意这里这个DataSource对象要和mybatis中的DataSource对象一样

spring amqp事务 spring事务和aop_回滚_21

 

 

 然后就在SpringConfig类上面添加@EnableTranesacction..标签

spring amqp事务 spring事务和aop_spring amqp事务_22

 

 

 

那么这个Spring是怎么实现事务管理的呢?其中有两个内容就是:事务管理员和事务协调员

spring amqp事务 spring事务和aop_spring amqp事务_23

     

spring amqp事务 spring事务和aop_spring amqp事务_24

 

 

 

 事务管理员就是开启事务,而协调员负责是否加入事务,如果加入那么就是同一个事务,回滚和提交都有一致性。

spring amqp事务 spring事务和aop_事务管理_25

 

 

 然后就是事务相关配置;其中有个重要的就是rollbackFor,就是设置遇到那些异常应该回滚,因为在默认情况下只有运行时的异常才会被回滚,而一些异常不属于运行异常,从而不被察觉,因此要在@Transaltion注释中设置把要视为异常的操作设置进去:

 

 

spring amqp事务 spring事务和aop_回滚_26

 

 

 然后就是事务传播行为:

spring amqp事务 spring事务和aop_数据_27

 

 

 

简单来说就是当事务管理员开启事务时,事务协调员选择加入或者不加入事务。怎么选择呢?那就是通过设置@Transaltion中的propagtion来完成。

spring amqp事务 spring事务和aop_回滚_28

 

 

spring amqp事务 spring事务和aop_数据_29

 

 他还有其他属性的设置:

spring amqp事务 spring事务和aop_spring amqp事务_30