关于什么是AOP,这里还是要简单介绍下
AOP,Aspect Oriented Programming,面向切面编程,通过预编译和运行期间提供动态代理的方式实现程序功能的统一维护,使用AOP可以降低各个部分的耦合度,提高代码质量
JoinPoint 连接点:程序执行的某个特定位置
PointCut 切点:执行的具体位置(哪些方法要执行)
Advice 增强:额外的业务逻辑
Aspect 切面:切点+增强
这些都是比较正式的定义,为了便于理解,用我们身边前一段的状况举个简单的来描述下AOP到底是用来干嘛以及这些重要概念到底指的是什么吧
俺叫李四,是一只打工崽,俺的一天是这样的:
上班离开居住的小区,进入上班的写字楼,中午去办公楼对面街的小饭馆恰饭,晚上下班离开写字楼,进小区回家
井然有序,而且成年累月几乎不会有什么大改变,
忽然,XXX流感开始蔓延起来了,于是在写字楼、小饭店这些公共场合的门口都增加了一个进入需要【扫看】的流程(还好出入小区不用),于是,俺的一天变成了这样:
上班离开居住的小区,【扫看】进入上班的写字楼,中午去办公楼对面街的小饭馆【扫看】恰饭,晚上下班离开写字楼,进小区回家
于是——
进出小区、进出写字楼、进出恰饭的小饭店,这些所有可能会增加“额外的业务逻辑”的地方——Join Point 连接点
【扫看】的流程就是俺日常生活以外的部分,即“额外的业务逻辑”——Advice 增强
写字楼、恰饭的小饭店,真实增加了【扫看】这个额外的业务逻辑”的地方——Point Cut 切点
不知道有没有客官注意到,真实的情况是:只有进入这些场所的时候需要【扫看】,离开是不需要的,而切点只标明了位置,那么哪里对“进入”还是“离开”需要【扫看】做出了限制呢?
自问自答:Advice 增强
因为Spring AOP中的Advice其实也是有分类的,我们可以直接通过源代码进行查看
可以看到,抽象类AbstractAspectJAdvic有5个的实现类:
AspectJAfterAdvice 后置通知
方法退出的时候执行,不论是正常返回还是异常退出都会执行
AspectJAfterReturningAdvice 返回后通知
方法退出的时候执行,只有方法正常完成后执行
AspectJAfterThrowingAdvice 抛出异常后通知
方法退出的时候执行,只有方法抛出异常退出时执行
AspectJAroundAdvice 环绕通知
可以将要执行的方法(point.proceed())进行封装,可在其前后添加需要执行的操作
AspectJMethodBeforeAdvice 前置通知
方法调用前执行