SpringAOP
简单转账功能
新建Maven项目 spring-aop,设置好Maven版本,配置文件以及Maven仓库
准备工作:
#删除spring_aop数据库如果存在spring_aop,则
删除 数据库 ;
#创建spring_aop数据库
创建 数据库spring_aop;
#使用spring_aop数据库
use spring_aop;
#创建一个account表
创建 表 帐户(id int(11)auto_increment主键, accountNum varchar(20)默认为NULL, money int(8)默认为0);
#新增数据
插入 到 账户(accountNum,资金)值
(“622200001” ,1000),(“622200002” ,1000);
1.ConnectionUtils.java
2.Account模块实体类:Account.java
3.Account模块Dao层:AccountDao.java
4.Account模块Dao层实现类:AccountDaoImpl.java
5.Account模块Service层:AccountService.java
6.Account模块Service层实现类:AccountServiceImpl.java
7.Account模块测试类:AccountTest.java
8.事务管理器:TransactionManager.java
引入代理模式解决事务
创建一个工具类,目的是用于管理数据库的事务,提供事务的开启,提交,回滚等操作;
代码实现:
9.事务代理工具类:TransactionProxyUtils
事务代理工具类:TransactionProxyUtils
此类的核心代码是getAccountService方法,该方法返回代理业务类示例
在代理对象的invoke方法内部,实现对原始被代理对象的增强
10.核心配置文件:applicationContext.xml
引入AOP(XML)
删除事务代理工具类:TransactionProxyUtils.java
引入aspectjweaver包:
<! -https://mvnrepository.com/artifact/org.aspectj/aspectjweaver- >
<依赖关系> < groupId > org.aspectj </ groupId > < artifactId > Aspectjweaver </ artifactId > <版本> 1.9.3 < /版本> </依赖关系>
配置文件中添加AOP的相关配置
<!-aop相关的例程配置->
< aop:config > <!-切入点表示该类的某种方法在执行的时候会应用Spring配置的通知进行增强-> < aop:pointcut表达式= “执行(* services。*。*(..))” id = “ pc” /> <!-配置切面类的代理作用主要就是整合通知和切入点-> < aop:aspect ref = “ transactionManager “ > < aop:before方法= ” beginTransaction“ pointcut-ref = ” pc“ /> < aop:返回后方法= ” commit“pointcut-ref = “ pc” /> <
aop:after 方法= “ release” pointcut-ref = “ pc” /> < aop:after-throwing方法= “ rollback” pointcut-ref = “ pc” /> </ aop:aspect > </ aop:config >
修改测试类代码
XML改注解(AOP)
- @方面 此注解用作表明某个类为切面类,而切面类的作用我们之前也解释过,用于整合切入点和通知
- @Pointcut 此注解用于声明一个切入点,表明某些类的某些方法需要被增强
- @之前预先通知 在连接点之前运行的通知类型,它不会阻止流程进行到连接点,只是在到达连接点之前运行该通知内的行为
- @AfterReturning后置通知 在连接点正常完成后要运行的通知,正常的连接点逻辑执行完,会运行该通知
- @After最终通知 无论连接点执行后的结果如何,正常还是异常,都会执行的通知
- @AfterThrowing异常通知 如果连接点执行因引发异常而退出,则执行此通知
代码实现:
删除XML中的AOPXML配置并注解代理模式
<!-注解开启代理模式->
< aop:aspectj-autoproxy > </ aop:aspectj-autoproxy >
注释事务管理器类:TransactionManager.java
一揽子交易;
@Component
@Aspect
公共 类 TransactionManager { //数据库连接工具类@Autowired私有ConnectionUtils connectionUtils;
@Pointcut(“ execution(* services。*。*(..))”)private void transactionPointcut () { }
/ **
*开启事务
* / @Before(“ transactionPointcut()”)public void beginTransaction () {尝试{ System.out.println(“开启事务”); connectionUtils.getThreadConnection()。setAutoCommit(false); } catch(SQLException e){ e.printStackTrace(); } }
/ **
*提交事务
* / @AfterReturning(“ transactionPointcut()”)public void commit () {试试{ System.out.println(“提交事务”); connectionUtils.getThreadConnection()。commit(); } catch(SQLException e){ e.printStackTrace(); } }
/ **
*回滚事务
* / @AfterThrowing(“ transactionPointcut()”)public void rollback () {试试{ System.out.println(“回滚事务”); connectionUtils.getThreadConnection()。rollback(); } catch(SQLException e){ e.printStackTrace(); } }
/ **
*释放连接
* / @After(“ transactionPointcut()”)public void release () {试试{ System.out.println(“释放连接”); connectionUtils.getThreadConnection()。close(); } catch(SQLException e){ e.printStackTrace(); } connectionUtils.removeConnection(); } }
执行结果
控制台打印结果: