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执行流程

相关推荐
金銀銅鐵19 分钟前
一个 Java 文件实现《孫子兵法·始計篇》中英对照阅读器
java·后端·ai编程
DevOpenClub24 分钟前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
qq_4069810325 分钟前
c++拷贝构造函数
开发语言·c++
bro_Java66634 分钟前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐1 小时前
MATLAB
开发语言·算法·matlab
文丑颜不良啊2 小时前
LeetCode2081~2100题目解析
java·leetcode
玖米GEO运营王总监2 小时前
2026年账号矩阵协同效应怎么量化:三个指标与公式结构
java·大数据·数据库
H.莓飛3 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
叼烟扛炮4 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
文丑颜不良啊4 小时前
LeetCode2061~2080题目解析
java·leetcode