当前位置: 首页 > article >正文

SSM之AOP与事务

前言

这一节我们会终结spring

1. 简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以看出我们这里只有save有记录时间的功能
在这里插入图片描述
但是我们运行其他的也可能会有这个功能
这就是在不惊动原来的设计,源代码不变,添加功能
在这里插入图片描述

追加功能的就是切入点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. AOP入门案例

2.1 分析

在这里插入图片描述

2.2 实现

在这里插入图片描述
在这里插入图片描述
1.导入坐标
在这里插入图片描述
context的包导入,AOP的包就自动导入了—》AOP开发是默认导入的
在这里插入图片描述

还要导入这个包
2.做好连接点(dao)
3.把功能性功能抽出来,单独做
在这里插入图片描述

  1. 定义切入点
    先定义一个私有方法

在这里插入图片描述
这个方法pt就是一个切入点,描述的是update这个方法

5.绑定method这个共性功能和切入点pt的关系
在这里插入图片描述
但是还不能运行,因为这个类不受spring控制
在这里插入图片描述
变成bean了,但是不知道这个类是做AOP的
在这里插入图片描述
这样就知道是做AOP的了
但是还不行
在这里插入图片描述

因为配置类那里还不知道你在整个程序中是拿注解开发的AOP
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们只需要加两个东西
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. AOP工作流程

在这里插入图片描述
意思是我们只读取有切面的切入点

在这里插入图片描述
意思是我们最终运行的是一个代理对象,如何看代理对象呢
在这里插入图片描述
在这里插入图片描述
我们用第二个方法就可以看到代理对象了,第一个方法就看到表面的对象
在这里插入图片描述
在这里插入图片描述

4. AOP切入点表达式

4.1 语法格式

可以描述接口,也可以描述实现类,都是可以的

在这里插入图片描述
在这里插入图片描述
但是如果切入点太多,就写很多,就很麻烦了

4.2 通配符

在这里插入图片描述
两个点表示任意个参数
一个星表示一个参数
第三个是以service结尾的类或者子类的任意方法的任意参数,返回值任意
就是任意业务层接口
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
因为没有参数,所以无法AOP,就是正常调用update
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
两个点就是任意
在这里插入图片描述
在这里插入图片描述
这就是匹配任意的

在这里插入图片描述
这个就是匹配u开头的方法
()前面的是方法,在前面的是类,前面的前面就是包
在这里插入图片描述
这个就是给业务层所有的查询方法加AOP

4.3 书写格式

在这里插入图片描述

5. AOP通知类型

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
前置通知

在这里插入图片描述
后置通知
在这里插入图片描述
在这里插入图片描述
下面开始讲环绕,就是前后都有的那种

在这里插入图片描述
在这里插入图片描述
先直接这样写的话,原始操作都不见了

在这里插入图片描述
在这里插入图片描述
现在开始写select的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意我们用around环绕的时候,原来有返回值的话,我们要在最后面把原始方法的返回值给扔出去
在这里插入图片描述
在这里插入图片描述
那我们的100哪去了,可以这样
在这里插入图片描述
注意外面那个函数的返回值最好写object
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以void的时候,函数around的返回值也可以写object
在这里插入图片描述
在这里插入图片描述
这两个有什么区别吗,AfterReturning是在没有抛异常的时候才会执行
了解即可

在这里插入图片描述
这个就是抛异常后才会执行的
常用的就是环绕通知
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 测量业务层接口万次执行效率

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
现在开始写aop
在这里插入图片描述
第一要监管service所有的方法
在这里插入图片描述
在此之前要先把aop注解打开
就是@EnableAspectJAutoProxy
在这里插入图片描述
这个null主要是因为我们打印了
在这里插入图片描述
在这里插入图片描述
缺点就是不知道这是哪个方法的运行时间
在这里插入图片描述

        Signature signature = pjp.getSignature();//原方法的签名信息
        System.out.println(signature.getDeclaringType());
        System.out.println(signature.getName());

在这里插入图片描述
这就找到了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. AOP通知获取数据

主要就是获取原始操作的参数,返回值,异常
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.1 参数

在这里插入图片描述

在这里插入图片描述
这就是拿参数的方式
在这里插入图片描述
在这里插入图片描述
注意proceed可以传参数进去,传进去声明,参数就变了
在这里插入图片描述
在这里插入图片描述

7.2 返回值

主要我们看afterReturning怎么得到返回值
在这里插入图片描述
我们用ret接收返回值,然后还要利用注解来告诉我们要用ret来接收返回值
在这里插入图片描述
在这里插入图片描述
returning = "ret"中的ret就是参数名
在这里插入图片描述
然后就是jp必须在ret的前面,如果有jp的话

7.3 异常

主要是afterThroeing方法
在这里插入图片描述
这样就可以了

后面两个了解即可,主要掌握参数的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. AOP总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9. Spring事务简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
万一业务层有错呢
在这里插入图片描述
这个有错,但是这个只会减钱,不会加钱,所以不行
在这里插入图片描述
所以我们要同成功同失败
加上 @Transactional就表示开启事务了
在这里插入图片描述
这个一般不写在实现类上,一般写在接口上
第二就是在配置中配置一个事务管理器

    //配置事务管理器,mybatis使用的是jdbc事务
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }

dataSource是外部注入的
在这里插入图片描述
这样我们就可以使用这个事务管理器了
第三就是还要在spring中告诉我们用注解来做事务
@EnableTransactionManagement就是这个即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为我们在接口中transfer中开了事务了,所以这两个操作同成功同失败
但是我们写在接口上,那么这个接口的所有方法就都开事务了

在这里插入图片描述
然后这里还是不变的

在这里插入图片描述
在这里插入图片描述
因为是jdbc的事务,所以用的是datasource的事务管理器,不然用其他事务的话,就要换一个了
在这里插入图片描述
在这里插入图片描述

10. spring事务角色

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

注意jdbc的datasource必须和事务管理器的datasource是一样的

11. spring事务属性

11.1 事务配置

在这里插入图片描述
因为有些异常是不回滚的,所以我们要设置rollbackFor
在这里插入图片描述
比如这种异常就是不回滚的

运行时异常是会回滚的,非运行时异常就不会回滚,比如我们上面这个

在这里插入图片描述
这个的意思就是遇到了IOException这个异常就要回滚

11.2 案例:转账业务追加日志

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
为了让日志一定执行,所以我们用try catch,这样就算异常了,也会执行

在这里插入图片描述
然后两个service均开启了事务
运行一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这下中间有了一个异常,但是我们并没有打印还是,为什么呢,因为日志记录和转账记录隶属于同一个事务,同成功同失败了
所以记不上日志
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
而我们要的就是日志的事务不要加入总的事务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们在log的services上面添加上这个propagation = Propagation.REQUIRES_NEW
就表示它自己创建自己的事务,不会与他们统一一个事务
再来运行一下
在这里插入图片描述
这样我们就成功了,就算有异常我们还是一样的记录了

在这里插入图片描述

11.3 事务转播行为

在这里插入图片描述

在我们的代码中AccountServiceImpl是管理员,LogServiceImpl是协调员

总结

下一节开始讲springMVC


http://www.kler.cn/a/412347.html

相关文章:

  • 【RISC-V CPU 专栏 -- 香山处理器介绍】
  • PIMPL模式和D指针
  • PyTorch基础05_模型的保存和加载
  • CRTP mixins EBO
  • Spring Bean初始化流程
  • LeetCode 0632.最小区间:优先队列
  • 缓存雪崩、击穿、穿透深度解析与实战应对
  • 使用OpenCV实现视频背景减除与目标检测
  • 【QT】背景,安装和介绍
  • 【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践
  • docker-compose文件的简介及使用
  • Git 使用技巧
  • 鸿蒙开发异步与线程
  • 使用Cmake导入OpenCV库的大坑记录
  • 如何将 GitHub 私有仓库(private)转换为公共仓库(public)
  • 反爬虫机制
  • 【大数据学习 | Spark-SQL】SparkSession对象
  • 从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级
  • 计算机网络 实验八 应用层相关协议分析
  • 【NOIP普及组】表达式求值
  • 学习threejs,设置envMap环境贴图创建反光效果
  • Qt程序发布及打包成exe安装包
  • 微信小程序首页搜索框的实现教程
  • idea_常用设置
  • RSA算法和AES算法,哪种更安全
  • 电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程