Spring AOP 简介

简介: Spring AOP 简介

一、Spring AOP

AOP 是一种思想,而 Spring AOP 是一个框架,提供了一种对 AOP 思想的实现。

1、什么是 AOP?

AOP(Aspect Oriented Programming):是一种编程思想,表示面向切面编程。指的是对某一类事情的集中处理

举一个常见的例子,当我们实现用户登录校验的时候,如果有多个网页都有同样的需求,那么我们传统的写法是在每个页面都写一个校验逻辑,这就会导致代码的可维护性降低。而如果我们使用

AOP 的思想,就可以对这种功能一致,且多次使用的功能进行统一的处理。

通过上面的例子,我们可以归纳出 AOP 的应用场景:

  • 统一的用户登录判断
  • 统一日志记录
  • 统一方法执行时间统计
  • 统一的返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

对于 AOP 来说,它可以扩充多个对象的某个能力,因此通常认为 AOP 是 OOP(Object Oriented Programming,面向对象编程)的补充和完善。

2、AOP 的组成

切面(Aspect):定义的是事件,描述了当前 AOP 的作用。是包含了 切点和通知 的类。例如定义当前AOP是进行统一用户登录判断的。


连接点(Join Point):连接点是在应用程序执行过程中可以插入切面的点,切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。典型的连接点包括方法调用、方法执行、异常抛出等。


切点(Pointcut):定义匹配 Join Point 的规则,给满足规则的 Join Point 添加 Advice。例如定义哪些接口判断用户登录权限,哪些不判断。


通知(Advice):AOP 执行方法的具体实现 。例如通过获取用户的 session 信息,判断用户登录状态。


在Spring AOP 中提供了以下五种类型的通知:

  1. 前置通知(@Before):通知方法会在目标方法调用之前执行。
  2. 后置通知(@After):通知方法会在目标方法返回或者抛出异常后调用。
  3. 返回通知(@AfterReturning):通知方法会在目标方法返回后调用。
  4. 异常通知(@AfterThrowing):通知方法会在目标方法抛出异常后调用。
  5. 环绕通知(@Around):通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

二、Spring AOP 实现

下面我们使用 Spring AOP 来完成拦截所有 UserController 里的方法,每次调用 UserController 中任意一个方法时,都执行相应的通知事件。

1、添加 AOP 框架支持

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、定义切面类

定义切面使用的是 @Aspect

@Aspect
@Component
public class UserAspect {

}

3、定义切点

定义切点使用 @Pointcut 注解,可在参数中定义匹配 Joint Point 的规则(这里使用的是 AspectJ 语法)

@Aspect
@Component
public class UserAspect {

    // 定义切点,使用 AspectJ 语法
    // 该切点规则将匹配 com.example.demo.controller.UserController 类
    // 中的所有方法,无论方法的返回类型和参数列表如何
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointCut(){}
}

4、实现通知

对于 前置通知、后置通知、返回通知、异常通知 的实现都如出一辙,并且非常简单,只需要添加给通知方法添加响应通知注解即可:

@Aspect
@Component
public class UserAspect {

    // 定义切点,使用 AspectJ 语法
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointCut(){}

    // 前置通知
    @Before("pointCut()")
    public void doBefore(){
        System.out.println("执行doBefore()前置通知!");
    }
    // 后置通知
    @After("pointCut()")
    public void doAfter(){
        System.out.println("执行doAfter()后置通知!");
    }
    // 返回通知
    @AfterReturning("pointCut()")
    public void doAfterReturn(){
        System.out.println("执行doAfterReturn()了返回通知");
    }
    // 异常通知
    @AfterThrowing("pointCut()")
    public void doAfterThrowing(){
        System.out.println("执行了doAfterThrowing()异常通知");
    }
    
}

比较复杂的是环回通知的实现,环回通知有它固定的格式:

@Aspect
@Component
public class UserAspect {
    // 定义切点,使用 AspectJ 语法
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointCut() {
    }
    // 环绕通知
    @Around("pointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around ⽅法开始执⾏");
        // 执行目标方法
        Object obj = joinPoint.proceed();
        System.out.println("Around ⽅法结束执⾏");
        return obj;
    }
}

其中 ProceedingJoinPoint 在环绕通知中可以控制目标方法的执行。通过调用 joinPoint.proceed() 可以触发目标方法的执行。如果目标方法有返回值,当目标方法执行完毕后,它会被保存在 obj 变量中,作为整个环绕通知方法的返回值返回给调用方。


调用 UserController 中的方法,得到测试结果:

三、Spring AOP 实现原理

Spring AOP 是构建在动态代理基础上的。Spring 的切面是由包裹了目标对象的代理实现的,代理类处理方法的调用,执行额外的切面逻辑,并调用目标方法。

Spring AOP 支持 JDK Proxy 动态代理和 CGLIB 动态代理技术,它们主要有以下区别:

  1. JDK Proxy 来自于 Java 本身,CGLIB 来自于第三方。
  2. JDK Proxy 动态代理是基于接口的,要求代理类必须实现接口才能实现代理;CGLIB 动态代理是基于类的,通过继承被代理类完成动态代理,因此要求被代理类不能是 final 修饰的类。
  3. 在 JDK 8 以上的版本中,JDK Proxy 动态代理做了专门的优化,所以性能比 CGLIB 高。
相关文章
|
4月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
579 0
|
3月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
8月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
1320 13
|
5月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
10月前
|
前端开发 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档—— Swagger 简介
第6课介绍了在Spring Boot中集成Swagger2以展示在线接口文档的方法。随着前后端分离架构的发展,API文档成为连接前端与后端开发的重要纽带。然而,代码更新频繁导致文档难以同步维护,Swagger2解决了这一问题。通过Swagger,在线API文档不仅方便了接口调用方查看和测试,还支持开发者实时测试接口数据。本文使用Swagger 2.2.2版本,讲解如何在Spring Boot项目中导入并配置Swagger2工具,从而高效管理接口文档。
368 0
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
587 6
|
5月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
7月前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
295 15
|
11月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
861 25

热门文章

最新文章