基于XML的AOP实现事务控制
# 120.基于XML的AOP实现事务控制
现在我们来通过AOP,完成一个数据库表的CRUD和事务控制
# 环境准备
我们在讲解AOP之前,自己实现了代理模式 ,现在我们基于当时的案例,来改造。读者也可以切换到分支demo10,然后在其基础上开发。
# 依赖准备
我们加上aspectj
的依赖,整体依赖如下:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- Spring IoC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 代码调整
以下包可以删掉:
- cglib
- factory
- proxy
删除bean.xml的配置:以下配置可以删掉
<!-- 配置代理的Service -->
<bean id="proxyAccountService" class="com.peterjxl.factory.BeanFactory" factory-bean="beanFactory" factory-method="getAccountService"/>
<!-- 配置BeanFactory -->
<bean id="beanFactory" class="com.peterjxl.factory.BeanFactory">
<property name="accountService" ref="accountService"/>
<property name="txManager" ref="txManager"/>
</bean>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
测试类中,删掉注入IAccountService时的@Qualifier("proxyAccountService")
。
# 增加约束
由于我们使用了约束,因此得在XML中加上约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 配置AOP
然后我们配置AOP
<!-- 配置AOP -->
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.peterjxl.service.impl.*.*(..))"/>
<aop:aspect id="txAdvice" ref="txManager">
<!-- 配置前置通知,开启事务 -->
<aop:before method="beginTransaction" pointcut-ref="pt1"/>
<!-- 配置后置通知,提交事务 -->
<aop:after-returning method="commit" pointcut-ref="pt1"/>
<!-- 配置异常通知,回滚事务 -->
<aop:after-throwing method="rollback" pointcut-ref="pt1"/>
<!-- 配置最终通知,释放连接 -->
<aop:after method="release" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试
我们可以在service实现类中,测试有异常和无异常的情况下,数据库的数据变化情况,可以看到能正常开启了事务。
# 源码
本项目已将源码上传到GitHub (opens new window)和Gitee (opens new window)上。并且创建了分支demo15,读者可以通过切换分支来查看本文的示例代码
上次更新: 2024/8/4 15:11:28