锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 深入理解AOP(面向切面编程)及其应用

深入理解AOP(面向切面编程)及其应用

0
  • 软件开发
  • 发布于 2024-09-21
  • 0 次阅读
黄健
黄健

目录

AOP的核心概念

AOP的实现方式

1. 定义DAO接口和实现类

2. 定义通知类

3. 开启AOP注解驱动

切入点表达式

通配符的使用:

AOP通知类型

案例分析:测量业务层接口的执行效率

结论



概述:
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,主要用于将共性功能从具体的业务逻辑中分离出来,实现松耦合的代码设计。其作用是在不修改原始代码的情况下,对现有方法进行增强,广泛应用于日志记录、安全检查、事务管理等场景。

AOP的核心概念

在AOP中,有几个核心的概念​(25-AOP工作流程)​(31-AOP开发总结):

  • 连接点(JoinPoint): 程序执行过程中可被拦截的点,如方法调用或异常抛出。
@Before("execution(* com.itheima.service.*.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
    System.out.println("方法名:" + joinPoint.getSignature().getName());
}
  • 切入点(Pointcut): 用来定义在哪些连接点上执行通知。可以使用表达式来选择目标方法​(26-AOP切入点表达式)。
    例如,execution(* com.itheima.dao.BookDao.save()) 匹配BookDao中的save方法。

  • 通知(Advice): 指定在某个切入点处执行的增强操作。通知可以在方法执行前(前置通知)、后(后置通知)、返回后(返回通知)、抛出异常后(异常通知)或者环绕执行​(27-AOP通知类型)​(31-AOP开发总结)。

@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    Object result = pjp.proceed();  // 调用原始方法
    long end = System.currentTimeMillis();
    System.out.println("方法执行时间:" + (end - start) + "ms");
    return result;
}
  • 切面(Aspect): 切面是通知与切入点的结合,切面定义了增强逻辑如何应用到具体的方法中。

AOP的实现方式

在Spring中,AOP的实现主要有两种方式:基于XML的配置方式 和基于注解的方式。目前使用较多的是注解方式。以下是一个基于注解的简单AOP实现步骤​(24-AOP入门案例):

1. 定义DAO接口和实现类


public interface BookDao {
    void save();
    void update();
}

@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("执行save方法");
    }
    public void update() {
        System.out.println("执行update方法");
    }
}


2. 定义通知类

通知类中定义了在方法执行前后的增强操作。例如,下面的MyAdvice类定义了在update方法执行前记录时间​(27-AOP通知类型)​(28-案例:测量业务层接口万次执行效率)。

@Aspect
@Component
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}

    @Before("pt()")
    public void before() {
        System.out.println("执行前时间:" + System.currentTimeMillis());
    }
}
3. 开启AOP注解驱动

在Spring配置类中,使用@EnableAspectJAutoProxy注解来开启AOP注解的自动代理​(24-AOP入门案例):

@Configuration
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy
public class SpringConfig {}

切入点表达式

切入点表达式是AOP中非常关键的一部分,它描述了要增强的方法,常见的切入点表达式格式为:

execution(访问修饰符 返回值类型 包名.类名.方法名(参数))

例如​

execution(* com.itheima.service.UserService.findById(..))


该表达式匹配UserService中名为findById的方法。

通配符的使用:
  • *:匹配任意符号。例如,execution(* *..*Service.*(..)) 匹配所有Service类中的任意方法。
  • ..:匹配多个连续的任意符号。例如,execution(* com.itheima..*.save(..)) 匹配com.itheima包下所有类中的save方法。

AOP通知类型

根据增强操作执行的时机,通知可以分为以下几种类型​(27-AOP通知类型):

  1. 前置通知(@Before): 在目标方法执行之前调用通知。

2.

   @Before("pt()")
   public void beforeAdvice() {
       System.out.println("前置通知执行...");
   }


  1. 后置通知(@After): 在目标方法执行之后调用通知。

4.

   @After("pt()")
   public void afterAdvice() {
       System.out.println("后置通知执行...");
   }


  1. 环绕通知(@Around): 可以在方法执行前后都添加增强逻辑。

    @Around("pt()")
    public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
       System.out.println("环绕通知执行前...");
       Object ret = pjp.proceed();  // 执行目标方法
       System.out.println("环绕通知执行后...");
       return ret;
    }
    


  2. 返回后通知(@AfterReturning): 在方法正常返回后执行。

    @AfterReturning(pointcut = "pt()", returning = "retVal")
    public void afterReturningAdvice(Object retVal) {
       System.out.println("返回后通知执行... 返回值: " + retVal);
    }
    

    异常通知(@AfterThrowing): 当方法抛出异常时调用。

    @AfterThrowing(pointcut = "pt()", throwing = "ex")
    public void afterThrowingAdvice(Exception ex) {
       System.out.println("异常通知执行... 异常信息: " + ex.getMessage());
    }
    

    案例分析:测量业务层接口的执行效率

    在实际开发中,AOP被广泛应用于日志记录和性能监控。在以下案例中,通过环绕通知,我们可以测量业务接口执行的时间​
    7.

    @Around("execution(* com.itheima.service.*.*(..))")
    public Object measureExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
       long start = System.currentTimeMillis();
       Object result = pjp.proceed();  // 执行目标方法
       long end = System.currentTimeMillis();
       System.out.println("方法执行时间:" + (end - start) + "ms");
       return result;
    }
    

    结论

    通过AOP,可以轻松地将共性功能与业务逻辑分离,减少代码重复,提高代码的可维护性。AOP的核心在于定义好切入点,并使用合适的通知来增强方法。

原文链接: https://blog.csdn.net/2302_80084329/article/details/142268031

标签: #JAVA 991 #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.