一文了解SpringBoot中的Aop

目录

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,我们就可以实现

一文了解SpringBoot中的Aop_第1张图片

另外,在以下场景也可以借助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的一个简单案例了,具体如何使用他,还需要根据实际的业务场景来拓展~~

你可能感兴趣的:(#,进阶篇,spring,boot,java,spring,Aop)