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

相关推荐
爱吃喵的鲤鱼7 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
LuckyLay13 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
向阳121826 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
DARLING Zero two♡34 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
Gu Gu Study36 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript