AOP基础

黑马程序员JavaWeb开发教程

文章目录

一、AOP概述

  • AOP:Aspect Oriented Propragramming(面向切面变成、面向方面编程)其实就是面向特定方法编程
  • 场景:
    • 案例部分功能运行比较慢,定位执行耗时比较长的业务方法,此时需要统计每一个业务方法的执行耗时。
      • 记录案例开始前的时间
      • 运行案例
      • 记录案例执行完成后的时间,计算案例执行时间
  • 实现
    • 动态代理是面向切面变成最主流的视线。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。

二、AOP快速入门

2.1 步骤

  1. 导入依赖:在pom.xml中导入AOP的依赖

    复制代码
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
  2. 编写AOP程序:针对与特定方法根据业务需要进行编程

    package com.itheima.mytlias.aop;

    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;

    @Slf4j
    @Component
    @Aspect
    public class TimeAspect {
    //指定当前方法可以作用在哪些方法上(com.itheima.mytlias.service)所有包的所有接口和方法上
    @Around("execution(* com.itheima.mytlias.service..(..))")
    public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    //1.记录方法开始时间
    long begin = System.currentTimeMillis();
    //2. 调用原始方法
    Object object = proceedingJoinPoint.proceed();//调用原始方法
    //3. 记录方法结束时间
    long end = System.currentTimeMillis();
    //4. 输出方法运行耗时
    log.info(proceedingJoinPoint.getSignature() + "执行耗时:{}ms", end - begin);
    return object;

    复制代码
     }

    }

  3. 测试

  • 首先需要运行程序,之后打开前端页面执行一个功能就可以看到日志中打印出来的耗时提醒

2.2 AOP的使用场景

  1. 记录曹组日志
  2. 权限控制
  3. 事务管理

2.3 AOP的优势

  1. 无代码侵入
  2. 减少重复代码
  3. 提高开发效率
  4. 维护方便

三、AOP核心概念

3.1 AOP核心概念

  1. 连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)
  2. 通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法);也就是入门程序中的recordTime 方法
  3. 切入点:PointCut,匹配连接点的条件,通知会在切入点方法执行时被应用(实际被AOP控制的方法)
  4. 切面:Aspect,描述通知与切入点大的对应关系(通知切入点)
  5. 目标对象:Target,通知所应用的对象

3.2 AOP执行流程

相关推荐
申城异乡人9 分钟前
聊聊@Autowired注解的Field injection is not recommended提示问题
java·spring
黄暄26 分钟前
分布式锁优化:使用Lua脚本保证释放锁的原子性问题
java·redis·分布式·后端·junit·lua
敲键盘的小夜猫36 分钟前
Retrievers检索器+RAG文档助手项目实战
java·数据库·算法
stein_java37 分钟前
springMVC-9数据格式化
java·开发语言
李少兄40 分钟前
Java集合初始化:Lists.newArrayList vs new ArrayList()
java·开发语言·python
nbsaas-boot43 分钟前
小团队如何落地 Scrum 模型:从 0 到 1 的实战指南
开发语言·架构
独立开阀者_FwtCoder43 分钟前
如何让 Cursor AI Agent始终遵守项目规范:使用自动规则生成技术
java·前端·javascript
love530love1 小时前
【笔记】Windows系统部署suna基于 MSYS2的Poetry 虚拟环境backedn后端包编译失败处理
开发语言·人工智能·windows·笔记·python·numpy
黄雪超1 小时前
JVM——从JIT到AOT:JVM编译器的云原生演进之路
java·开发语言·jvm
yunvwugua__1 小时前
Python训练营打卡 Day43
开发语言·python