AOP全称Aspect-Oriented Programming,即面向切面编程,是面向对象编程(OOP)的一种补充。
在通常的业务处理中,都会进行事务处理、日志记录等操作,比如:
class User{ public void addUser(){ ...... //添加用户 ....... //记录一条日志:xxx时间添加xxx用户,操作者:xxx,操作结果:xxx } public void alterUser(){ ....... //修改用户 ........//记录一条日志:xxx时间修改xxx用户,操作者:xxx,操作结果:xxx } public void deleteUser(){ .......//删除用户 .......//记录一条日志:xxx时间删除xxx用户,操作者:xxx,操作结果:xxx }
这是一个操作用户的类,是对用户的抽象,日志操作和用户操作其实没有半毛钱关系,上面的抽象并不好,把用户操作和日志操作杂糅在一起,应该把日志操作分离出去,这样才符合OOP的编程思想。
而且后期不好维护、升级,比如后面要修改日志操作,你找到User类,在addUser()中一部分是用户操作,一部分是日志操作,你要先找到哪些是日志操作,然后改。后面的方法也是如此,很繁琐。
AOP解决了此问题。AOP是一种新的编程思想,是OOP的一种补充。OOP专心负责核心业务,AOP负责其它杂七杂八的业务。
OOP好比是经理,AOP好比是助理。原先所有事儿,什么批文件、见客户、通知下级来开会、向下级传达指示,所有事儿都是自己做,很繁琐,搞得精疲力竭,还容易出问题。
现在招了助理AOP,总经理OOP可以专心处理核心的业务,批示下文件、见见客户就行了。传递指示、通知下级开会,这些事儿助理AOP来做。分工明确,效率
高很多。
这些操作可以被多个类使用,叫做切面(Aspect)。
实现AOP的3种方式
- 自己写代理来增强原来的类 十分麻烦
- 使用Spring AOP 简单,但需要在xml中写大量的配置
- 使用AspectJ AspectJ是一个专业的AOP框架,十分强大
最常用的方式是由Spring整合AspectJ。(AspectJ一般不单用)
Spring致力于一站式开发方案,给多个方面都提供了实现,比如提供了JdbcTemplate来操作数据库,提供了Spring AOP来实现AOP。
Spring功能太杂,不够专业。
操作数据库,JdbcTemplate哪有持久层框架mybatis专业;实现aop,Spring AOP哪有AspectJ专业。
一般把Spring作为容器(管理Bean),其它方面由专业框架来实现,Spring把它们整合进来。
AOP的5种常见通知(有误、待修改)
通知类型 | 增强时间 | 常见应用 |
前置通知 | 在目标方法执行前进行一些处理 | 权限管理 |
后置通知 | 在目标方法执行后进行一些处理 | 关闭流、上传文件、删除临时文件 |
返回通知 | 在返回目标方法的返回值后进行一些处理 | |
异常通知 | 在方法抛出异常后进行一些处理 | 处理异常、记录异常 |
环绕通知 |
命名思议,环绕在目标方法的整个生命周期,即作用于目标方法的整个调用流程, 可实现前增强、后增强、异常处理等功能。 |
常见的执行流程:
- 执行前置通知(前增强)
- 执行目标方法,并用一个变量保存目标方法的返回值
- 执行后置通知(后增强)
- 返回目标方法的返回值
- 执行返回通知