今天重点在事务

  1. AspectJ对AOP的实现

对于AOP这种编程思想,很多框架都进行了实现。Spring就是其中之一,可 以完成面向切面编程。然而,AspectJ也实现了AOP的功能,且其实现方式更为简捷, 使用更为方便,而且还支持注解式开发。所以,Spring又将AspectJ的对于AOP的实 现也引入到了自己的框架中。

在Spring中使用AOP开发时,一般使用AspectJ的实现方式。

  1. AspectJ的通知类型

AspectJ中常用的通知五种类型: 

前置通知 

后置通知 

环绕通知 

异常通知 

最终通知:无论程序执行是否正常,该通知都会执行。类似于 try..catch中finally代码块。

  1. AspectJ的切入点表达式

49e64a929388f494eb19b19c99d4d984.png

切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达式中明显就是方法 的签名。注意,表达式中加[ ]的部分表示可省略部分,各部分间用空格分开。在其中可以使 用以下符号:

089602299bc57d61b30469a0c4ecc55a.png

11. AspectJ的切入点表达式

举例:

execution(public * *(..)) 指定切入点为:任意公共方法。

execution(* set *(..)) 指定切入点为:任何一个以“set”开始的方法。

execution(* com.xyz.service.*.*(..)) 指定切入点为:定义在service包里的任意类的任意方法。 execution(* com.xyz.service..*.*(..)) 指定切入点为:定义在service包或者子包里的任意类的任意方法。“..”出现在类名中时, 后面必须跟“*”,表示包、子包下的所有类。

execution(* *.service.*.*(..)) 指定只有一级包下的serivce子包下所有类(接口)中的所有方法为切入点

execution(* *..service.*.*(..)) 指定所有包下的serivce子包下所有类(接口)中的所有方法为切入点

12.搭建AspectJ的开发环境

12.1 导入两个Jar包

983ad70c1d8a8ebd427d7179acdfd031.png

12.2 引入AOP约束

548a3a64abf61b5ed5e593186e86270f.png
  1. AspectJ对于AOP的实现有两种方式: 注解方式  XML方式
    1. 注解方式

56fb310170c5e9b7229be5e5e445de60.png
  1. 前置注解

f4b9df5979a29b540664c4983fcabc20.png

运行结果图

b7aa4cf9fa42c2f600217bc7f40e49e3.png
  1. 后置注解

出现bug1:

7be096d2044941de0a3addd06e6fbb28.png

问题原因: execution写成execute

90b09d73f156fc5f44803440faada9e6.png

运行结果图

c4e65682125f200b3096a45598ab6ad6.png
  1. 环绕注解

ccd415f1382622a1eb6c130689c3867a.png

运行结果图

456d414adb9f184b58da9f91150a3399.png
  1. 异常注解

cc5c8c16b38353c525060815526fa708.png

运行结果图

17bd72c54336cd35dfa6b9ba9f50e1cf.png
  1. 最终注解 (无论程序执行是否正常,该通知都会执行。类似于 try..catch中finally代码块)

下面是在异常之后仍然执行的

f164397c77cca79693300b1ff103db58.png
    1. XML方式

需要在配置文件中进行AOP配置

  1. 前置通知

440518ed718ef9305e040968bbb877cd.png
  1. 带参前置通知

caa5ff30f88caae6c1b825fb4c4e1e4f.png
  1. 后置通知

13533ea20ce5abf2a74b7fe751586b8a.png
  1. 环绕通知
  2. 异常通知
  3. 最终通知

四、Spring的事务管理

事务原本是数据库中的概念,在Dao层。但一般情况下,需要将事务提升到 业务层,即Service层。这样做是为了能够使用事务的特性来管理具体的业务。

事务管理案例:

(1)创建实体类account和fund 及表

6cdfe9688972948155133a8764b83009.png

258550c74718319709e258881aa5e5d1.png

(2)创建dao及实现类

AccountDao接口

cc38220d99729e5a66ec393be2485f6c.png

AccountDaoImpl实现类

e4b20f63431f0786b6933f5d1b278806.png

FundDao接口

81ff5e28fad697ccaaa9244fc1f6b55b.png

FundDaoImpl实现类

55f833143642ee1c531747f64cf1dd03.png

(3)创建service接口及实现类

3bc0786d573d71311080bfdc300c0892.png

实现类

5d4eb6d011eb14d87c999e0dc93eab67.png

0efa534ed114ab0907c2957dc91cf7a0.png

(4)测试

367617e9bea555012d601fb04f31d354.png

9609ea0b95fd375589988e1bbd6e0684.png
  1. Spring事务管理API介绍
    1. 1事务管理器

是PlatformTransactionManager接口对象。其主要 用于完成事务的提交、回滚,及获取事务的状态信息。

PlatformTransactionManager接口常用的两个实现类 

DataSourceTransactionManager:使用JDBC或MyBatis 进行持久化数据时使用。  HibernateTransactionManager:使用Hibernate进行持久化数据时使用。

    1. 2Spring的回滚方式

Spring事务的默认回滚方式是:发生运行时异常时回滚,发生受查异常时提交。

在视频中添加异常之后,测试buyFund方法.如果添加银行账户和基金账户都没有发生改变,则说明事务发生了回滚.如果都进行了改变则说明发生了事务的提交

    1. 3事务定义接口

事务定义接口TransactionDefinition中定义了事务描述 相关的三类常量:事务隔离级别、事务传播行为、事务默认超时时限,及对它们的 操作。

所谓事务传播行为是指,处于不同事务中的方法在相互调用时,执行期间事 务的维护情况。如,A事务中的方法doSome()调用B事务中的方法doOther(),在调 用执行期间事务的维护情况,就称为事务传播行为。

REQUIRED:指定的方法必须在事务内执行。若当前存在事务,就加入到当前 事务中;若当前没有事务,则创建一个新事务。这种传播行为是最常见的选择

2 环境搭建(导入jar包、添加约束)

3 使用AspectJ的AOP配置管理事务(重点)

90958edde2343405dd0f8e07b94bc4f0.png

e3bb245df0f0e4cebe39f3b4d2d936c9.png

1582f89f6dba17def240aa1c6d46cf84.png
  1. 注册事务管理
  2. 注册事务通知
  3. AOP配置

9c45c40614288ec7b9500b1428688e84.png

运行结果

eb1773a7f3d6f1ee12f434dfc02fcca1.png

4 使用事务注解管理事务

做事务管理案例时出现的bug问题:

Bug2

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'accountDaoImpl' of bean class [com.zzsxt.service.impl.FundServiceImpl]: Bean property 'accountDaoImpl' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

错误原因: FundServiceImpl中没有设置两个属性的getset方法

bafaa79732fc568febad46fc96305dd6.png

Bug3 org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!

Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!

Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.

错误原因: 错误的jdbc.properties.

错误的配置:

cf5387c612a46d96367dafc7f87155e3.png

正确的配置:

b3c2dc0c652b4b4c54a1b3aceb9e22b8.png

358e931a3846c83175558612d7d3026b.png
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐