Spring的aop,aop的意思是:面向切面编程,而在Sprin中的Aop具体来说是在不动原始类中的方法的情况下,给其中的方法做增强功能。
连接点就是原始类中所有的方法,切入点是原始类中需要做增强的方法,也就是需要和Spring绑定的方法,通知就是需要做的增强的功能,也就是切入点执行的操作,切面就是描述同志爱和切入点之间的关系(是after还是before还是around)
然后这个aop是怎么实现的呢
首先需要导入相关坐标
,然后在SpringConfig上面写上一个@EnableAspect,,注解,告诉这个SpringConfig类要加载这个aop的通知类
然后就是写通知类:
随便起个名字即可,然后其中的随便写个方法,例如private void pt(){},
关键在于上面的注解,注解后面有一行内容,就是切入点表达式,用来描述切入点的,就是那个包下的那个类中的那个方法要作为切入点,描述方式有两种一种是写接口中的,另一种是写实现类中的,但是为了减低代码的耦合性所以,就选用第一种方法
然后这个表达式的里面的具体代表些什么东西呢?有动作关键字,访问修饰符,返回值类型,包,类,方法等等。。。
然后可以使用*通配符,这样可以快速匹配到切入点,
比如说这个切入点表达式就代表,任意返回类型,com.itheima下任意包下以Service结尾的任意类下的,以find开头的任意方法,参数任意
这个切入点表达式写的话也有一些默认的便于阅读的方式,也就是一些技巧:
写完切入点之后需要写一个方法,方法里面就写通知,也就是需要增强的功能,然后再通知上需写上一个注解,注解里面写上那个切点的方法,这个注解就表名这个切入点与属性的关系,是前置还是后置,还是环绕,相当于把切入点与通知绑定起来,也就是搞成了切面。
这个注几种类型,也就代表通知有几种类型:前置,后置,环绕,返回,抛出异常。
然后在这个通知中可以获得一些数据,这些数据包括:或去参数,返回值,异常。
重点需要知道环绕通知,环绕通知里面,需要一个ProceedingJoinPoint 创建的对象来调用这个proceed()这个方法,因为如果不调用这个方法,那么原始类中的方法不会执行,而只会执行这个通知中的方法,也就是增强的功能。有的原始方法,他是有返回值类型的,所以我定义方法的返回类型为Object,然后再return这个结果“ret”
再说一下这个aop得工作流程吧,Spring容器启动后,先读取所有切面配置中的切入点,然后初始化bean,判定bean对应的类中方法是匹配到任意切入点,也就是比对是否有这个切入点一样的方法,如果有那就创建原始对象的代理对象,执行原始方法和增强方法,如果没有也就是匹配失败,那就创建原始对象,执行原始方法。
通知获取的数据::;
具体用例如下:
然后可以可以根据这个ProceedingJoinPoint对象来改原始类中的参数,从而影响原始方法的执行:(百度网盘去空格操作)
改完这个args后再重新把他传给proceed方法也就是原始方法执行。
然后Spring事务就是把,那个很多操作,可以化为一个事务,也可以化为多个事务,便于事务回滚与提交:
这个Spring事务开启主要有三步:
首先在业务层接口添加Spring事务管理注释:@Transation
然后设置事务管理器:注意这里这个DataSource对象要和mybatis中的DataSource对象一样
然后就在SpringConfig类上面添加@EnableTranesacction..标签
那么这个Spring是怎么实现事务管理的呢?其中有两个内容就是:事务管理员和事务协调员
事务管理员就是开启事务,而协调员负责是否加入事务,如果加入那么就是同一个事务,回滚和提交都有一致性。
然后就是事务相关配置;其中有个重要的就是rollbackFor,就是设置遇到那些异常应该回滚,因为在默认情况下只有运行时的异常才会被回滚,而一些异常不属于运行异常,从而不被察觉,因此要在@Transaltion注释中设置把要视为异常的操作设置进去:
然后就是事务传播行为:
简单来说就是当事务管理员开启事务时,事务协调员选择加入或者不加入事务。怎么选择呢?那就是通过设置@Transaltion中的propagtion来完成。
他还有其他属性的设置: