目录
1.什么是Aop
2.相关概念
3.相关注解
4.为什么要用Aop
5.Aop使用案例
1.什么是Aop
AOP:Aspect Oriented Programming,面向切面,是Spring三大思想之一,另外两个是
IOC-控制反转
DI-依赖注入 (@Autowired、@Qualifier、@Resource)
2.相关概念
- 切面(aspect):横切面对象,一般为一个具体类对象(可以借助@Aspect声明),可以理解为要植入的新的业务功能,这个功能交给某个类负责,这个类就是切面。
- 切入点(pointcut):对连接点拦截内容的一种定义,在原有的哪些业务方法上扩展新的业务,可以将切入点理解为方法的集合,可以是1个类或某些类。
- 连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的的方法,可以简单理解为切入点中的一个具体方法。
- 通知(advice):拦截到连接点之后只要执行的方法,可以理解为一个业务中的扩展逻辑的若干步骤,先做什么(before),再做什么(afterReturn),最后做什么。
- 目标对象(target):封装原业务逻辑的对象。
- 代理对象(proxy):负责调用切面中的方法为目标对象植入新的功能。
3.相关注解
@Pointcut | 定义切入点 |
@Before | 目标方法执行之前执行 |
@After | 目标方法执行之后必定执行,无论是否报错 |
@AfterReturning | 目标方法有返回值且正常返回后执行 |
@AfterThrowing | 目标方法抛出异常后执行 |
@Around | 可以获取到目标方法的入参和返回值 |
4.为什么要用Aop
举个例子,假设我们有一个新增数据,和一个删除数据的功能。
可能之前的逻辑是
开始->鉴权->新增数据->记录操作日志->结束
开始->鉴权->删除数据->记录操作日志->结束
借助Aop,我们就可以实现
另外,在以下场景也可以借助Aop
系统日志处理、系统事务处理、系统安全验证、系统数据缓存等
5.Aop使用案例
先看一个简单的例子,就是通过execution表达式来定义某个包小的所有方法为切入点
第一个 * 符号 | 表示返回值的类型任意 |
com.aop.service | 即需要进行横切的业务包 |
包名后面的 .* | 表示当前包下面的类 |
.*(..) | 表示任何方法名,括号表示参数,两个点表示任何参数类型 |
@Aspect
@Component
@Slf4j
@Order(10)
public class AopAdvice {
@Before("execution (* com.erich.yand.service.console.day.end.*.*(..))")
public void beforeAdvice() {
log.info("beforeAdvice...");
}
@After("execution (* com.erich.yand.service.console.day.end.*.*(..))")
public void afterAdvice() {
log.info("afterAdvice...");
}
@Around("execution (* com.erich.yand.service.console.day.end.*.*(..))")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
log.info("before");
try {
proceedingJoinPoint.proceed();
} catch (Throwable t) {
t.printStackTrace();
}
log.info("after");
}
}
当有多个切面时,Order越小越先执行。
执行后,可以看到结果
说明执行到我们定义的包下的方法时,确实切进来了~~
以上就是Aop的一个简单案例了,具体如何使用他,还需要根据实际的业务场景来拓展~~