一、AOP的简单了解
(一)什么是AOP
AOP:全称是 Aspect Oriented Programming 即:面向切面编程。
简单的说它就是把我们程序中重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的
基础上,对我们的已有方法进行增强。
(二)AOP的作用及优势
作用:
在程序运行期间,不修改源码对已有方法进行增强。
优势:
减少重复代码
提高开发效率
维护方便
二、Spring中的AOP术语和细节
1、Joinpoint(连接点):
所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点
2、Pointcut(切入点):
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义
3、Advice(通知/增强):
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知
4、Introduction(引介):
引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field
5、Target(目标对象):
被代理对象
6、Weaving(织入):
是指把增强代码应用到目标对象来创建新的代理对象的过程。
spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
7、Proxy(代理):
一个类被 AOP 织入增强后,就产生一个结果代理类
8、Aspect(切面):
是切入点和通知(引介)的结合
三、Spring基于XML的AOP
针对AOP的快速入门,提供模拟案例(不关注业务,只关注常用的用法)进行参考,如下:
(一)项目结构
(二)pom.xml:
1 |
|
注:如果需要使用AOP,则一定要记得导入aspectjweaver。
(三)service层
IAccountService.java:
1 | /** |
AccountServiceImpl.java:
1 | public class AccountServiceImpl implements IAccountService { |
(四)utils
Logger.java:
1 | /** |
(五)进行AOP的配置
bean.xml:
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
四、切入点表达式的写法
1 | 切入点表达式的写法: |
五、通知类型
(一)四种常用通知类型
1 | aop:before |
1 | aop:after-returning |
1 | aop:after-throwing |
1 | aop:after |
针对第三点中的项目,如果Logger.java修改为如下:
Logger.java:
1 | /** |
并且假设service中的addAccount方法,分别需要Logger中的这四个方法进行方法增强,那么可配置如下:
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
但是仔细思考,我们会发现即使是相同的切入点表达式也需要重复进行指定,因此Spring就提供了一个<aop:pointcut>
标签可以提取相同的切入点表达式,并且我们只需要在配置的标签中使用point-cut属性调用即可。如下:
1 | <!-- 表明开始aop配置 --> |
(二)环绕通知
1 | aop:around: |
针对第三点中的项目,如果Logger.java修改为如下:
Logger.java:
1 | /** |
注:spring 框架为我们提供了一个接口:ProceedingJoinPoint,它可以作为环绕通知的方法参数。在环绕通知执行时,spring 框架会为我们提供该接口的实现类对象,我们直接使用就行。
配置修改如下:
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
(三)小结
其实环绕通知就相当于其他四个常用通知。只不过四个常用的四个通知是可以通过XML文件或者和注解的方式进行配置;
而环绕通知则是通过代码自己手动进行配置。
六、总结
其实也可以通过注解的方式进行配置来实现AOP,但是由于在实际使用时会有一点小问题(通知的执行顺序有点小问题),因此此处不做总结。
Java新手,若有错误,欢迎指正!