Spring中AOP原理与使用案例

一、什么是AOP

AOP (Aspect Oriented Programming) ,意为: 面向切面编程,可以通过预编译方式或运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP的编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的增加代码的重用性,提高开发效率。

二、AOP的应用场景

Spring中AOP原理与使用案例_第1张图片

三、AOP中的概念定义

Spring中AOP原理与使用案例_第2张图片

通知advice的类型

Spring中AOP原理与使用案例_第3张图片

四、Springboot中如何使用AOP

  • SpringBoot项目导入spring-boot-starter-aop依赖
  • 编写切面类
    • 类上加@Aspect注解,表明这是一个切面类。
    • 类上加@Component,把切面交给Spring管理(我们要切的Controller/Service都是Spring容器的,切面要对它们起作用,就必须同样进入容器)
    • 类内部配置切点表达式,比如@Pointcut(“execution(* com.bravo.demo.controller..(…))”) 表示对com.bravo.demo.controller包下所有方法进行增强
      ○ 类内部编写通知,有5种注解@Before、 @After、 @AfterReturning、 @AfterThrowing、@Around表示不同的通知类型,分别表示织入到不同的连接点,如@Before(“myPointcut”),myPointcut为定义的切点,表示通知会在方法被调用前执行。SpringBoot会在运行时通过动态代理将切面类中的通知增强代码织入到对应切点的指定连接点位置。

五、AOP使用案例

引入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-aopartifactId>
dependency>

编写切面类,统计接口耗时

@Slf4j
@Aspect //1. 声明这是一个切面类
@Component //2. 交给Spring容器管理
public class ApiTimeLogAspect {

    // 3. 定义切点表达式,明确要对那些方法起作用(比如,只对com.example.java.controller包的方法计算接口耗时)
    @Pointcut("execution(* com.example.java.controller.*.*(..))")
    public void controllerPointcut() {
    }

    // 4.定义通知,引用切点表达式。编写增强逻辑
    @Around("controllerPointcut()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        String className = pjp.getTarget().getClass().toString();//获取类名
        String methodName = pjp.getSignature().getName();//获取方法名
        Object[] args = pjp.getArgs();//获取请求参数
        // 记录接口执行前的时间戳
        long startTime = System.currentTimeMillis();
        // 实际执行目标方法,类似动态代理的invoke()执行目标方法
        Object result = pjp.proceed();
        // 计算接口耗时
        log.info("------------ {}:{}耗时: {} ms ------------", className, methodName, System.currentTimeMillis() - startTime);
        // 只做增强不做改变,还是要把接口原本的结果返回
        return result;
    }
}

参考:https://www.bilibili.com/video/BV1yK411M7hb

你可能感兴趣的:(Java工程师,spring,java)