面向切面编程

1. SpringAOP基本概念

1.AOP概念和使用原因
现实中有 些内容并不是面向对象 (OOP )可以解决的,比如数据库事务,它对于企业级的 Java EE 应用而言是十分重要的 又如在电商网站购物需要经过交易系统、财务统,对于交易系统存在一个交易记录的对象,而财务系统则存在账户的信息对象。从这个角度而 ,我 需要对交易记录和账户操作形成一个统一的事务管理。交易和账户的事务,要么全部成功,要么全部失败。
在这里插入图片描述
从上图可知,交易和账户都是对象,两个对象需要在同一个事务中控制,因此需要面向切面的方法,切面就是数据库事务。
AOP的意义:首选可以拦截一些方法,然后将各个对象组织成为一个整体。当固定好动态的流程,则可以在交易前后、交易正常完成后或者交易异常发生时,使用约定记录相关的日志。
例如:使用MyBatis实现购买记录事务流程:
在这里插入图片描述
在这里插入图片描述
使用Spring实现修改角色备注:
在这里插入图片描述这段代码除了一个注解@Transactional 没有任何关于打开或者关闭数据库资源的代码,更没有任何提交或者回滚数据库事务的代码 但是它却能够完成之前上一段代码所示的全部功能。注意 这段代码更简洁, 更容易维护,主要都集中在业务处理上,而不是数据库事务和资源管控上,这就是 AOP 的魅力 。
一般正常的SQL的执行逻辑:
1、打开通过数据库连接池获得数据库连接资源,进行设置。
2、执行对应的SQL语句,对数据进行操作
3、当SQL执行过程发生异常则回滚事务
4、当SQL执行过程没有异常则最后提交事务
5、最后,关闭一些链接资源
在这里插入图片描述
可以看到该图和AOP的流程类似,完全可以按照该流程进行封装,使用动态代理将代码编入对应的AOP流程。例如:
1、打开获取数据连接在before方法中完成
2、执行SQL,使用反射机制调用
3、当发生异常则回滚事务,当没有异常则提交事务,然后关闭数据库连接资源
对于事务有如下约定:
1、当方法标有@Transactional时,则方法启用数据库事务
2、默认情况下,当原有方法出现异常则回滚事务,当没有发生异常则提交事务,这样整个事务管理AOP完成整个流程,无需编写任何代码实现
3、最后关闭数据库资源
使用AOP框架的SQL流程:
在这里插入图片描述
AOP通过动态代理方式带来管控各个对象操作的切面环境,管理包括日志、数据库事务等,可以在反射原有对象方法之前正常返回、异常返回事后插入自己的逻辑代码,甚至取代原始方法。一些常用的流程中,如数据库事务,AOP提供默认的实现逻辑。
2.面向切面的术语
(1)切面
切面就是在一个怎样的环境中工作。数据库事务直接贯穿整个代码层面,就是一个切面,能够在被代理对象的方法之前、之后,产生异常或正常返回后切入自己的代码。动态代理中可以将其理解为一个拦截器。
(2)通知
通知是切面开启后,切面的方法。根据在代理对象真实方法调用前、后的顺序和逻辑区分。
前置通知:在动态代理反射原有对象方法或者执行环绕通知前执行的通知
后置通知:在动态代理反射原有对象方法或者执行环绕通知后执行的通知,无论是否抛出异常都会被执行
返回通知:在动态代理反射原油对象方法或者执行环绕通知后执行的通知

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值