本文最后更新于319 天前,其中的信息可能已经过时,如有错误请发送邮件到15578243672@163.com
- 关于AOP编程
- AOP编程相关术语
- AOP编程的简单实操
关于AOP编程
AOP编程也被称为面向切面编程,我们可以把我们的业务逻辑看成一个块,如果我们想对每一个业务逻辑块进行一个统一的但是本身和业务逻辑相关性不大的功能的话,AOP就可以保证在不侵入原有业务代码逻辑的情况下实现我们要的功能。
比如现在我想对所有的业务逻辑块添加一个打印‘’hello‘’的功能,那么我就需要在原有的业务代码逻辑上加入一个打印语句,如果我有很多的业务逻辑块并且我要加入的功能语句比较长,那么过程将十分的繁琐,而且可以能会导致我们原先的业务代码十分臃肿,这个使用我们使用AOP面向切面编程不仅只需要在要使用的方法上打上注释就可以完成操作,并且不会对原有的代码结构上添加新的代码。AOP 的核心单元是切面(Aspect)。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而降低耦合度,提高程序的可重用性,同时也提高了开发效率。我们可以简单的把 AOP 理解为贯穿于方法之中,在方法执行前、执行时、执行后、返回值后、异常后要执行的操作。
AOP编程的相关术语
要实现上面所说的AOP编程,首先看下面这张图

- 横切关注点(Cross-Cutting Concern):意思是我们要额外添加的功能像“刀子”一样横着切入各个业务逻辑,本事与业务逻辑关联不大,但是又是每个业务逻辑块都需要的。比如耗时统计,日志管理
- 切面(Aspect):切面是指我们为实现AOP编程而创建的类,类中方法都是之前提到的与业务逻辑块没关系但是是要额外实现的功能,我们使用@Aspect来标记这个类是一个切面类
- 通知(Advice):切面类中的方法就是通知,我们可以利用注释来控制我们通知的启动时机
- 连接点(JoinPoint):程序执行过程中可以插入通知的所有位置
- 切点(Pointcut):表明这个通知要拦截的范围,由切点表达式来决定对什么位置进行拦截
切点表达式的写法如下
切入点表达式的语法格式规范如下所示:
execution(modifiers-pattern?
ret-type-pattern
declaring-type-pattern?
name-pattern(param-pattern)
throws-pattern?)
modifiers-pattern?为访问权限修饰符ret-type-pattern为返回类型,通常用*来表示任意返回类型declaring-type-pattern?为包名name-pattern为方法名,可以使用*来表示所有,或者set*来表示所有以 set 开头的类名param-pattern)为参数类型,多个参数可以用,隔开,各个参与也可以使用*来表示所有类型的参数,还可以使用(..)表示零个或者任意参数throws-pattern?为异常类型?表示前面的为可选项
| @Before | 在目标方法执行前执行我们的AOP方法 |
| @After | 在目标方法执行后执行我们的AOP方法 |
| @AfterRunning | 在方法返回正常的时候执行我们的AOP方法 |
| @AfterThrowing | 在方法抛出异常的时候执行 |
| @Aroud | 包裹整个目标方法使用 |
AOP编程的简单实操
@Aspect
public class AOPTest {
@Pointcut("execution(public * org.example.controller..*(..))")
private void tempPointcut(){};//统一的切点名称,这样我们就不用一个一个打切点了
@Before("tempPointcut()")//通知注释,表示通知的启动时机
public void logStart(){
System.out.println("日志开始记录");
}
@After("tempPointcut()")
public void logEnd(){
System.out.println("日志记录结束");
}
}
这样就会在根据通知的注释在对应时间启动,如果下载了插件的话,在通知旁边还会有一个标识来统计被拦截的方法有哪一些。当然我这里写的这个十分简单,下面这个是记录日记的AOP接口模式









