Spring AOP 的实现及原理

简介: Spring AOP 的实现及原理

什么是 Spring AOP ?


AOP 是啥 ?


我们知道 OOP 是面向对象编程, 那 AOP 又是啥呢 ?


AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理。


什么又是面向切面编程?


就比如:我上 CSDN 发布文章时,它会先查询我的登录状态,我查询个人文章列表时,也要查询登录状态,查看个人主页也一样,这些功能的共同点是查询登录状态,那判断用户是否登录这件事,它就是一个切面,他就是某一类事,面向切面编程就是面向某一类事进行编程,将某一类事集中处理了。(这样就可以把精力放在业务逻辑上,而不是编写重复代码)


AOP 是⼀种思想,⽽ Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现,它们的关系和 IoC 与 DI 类似。


Spring AOP 可以干啥 ?


统一用户登录判断

统一日志记录

统一方法执⾏时间统计

统⼀的返回格式设置

统⼀的异常处理

事务的开启和提交等等


AOP 是针对某一类通用的事件进行统一处理,它是 OOP 的一种补充。


AOP 的组成


  1. 切面 (Aspect):定义的是什么事件(AOP 是干什么的,比如:是用户登录校验)
  2. 切点 (Pointcut):定义具体规则(定义用户拦截规则,比如:哪些接口需要判断用户登录,哪些接口不需要判断)
  3. 通知 (Advice):AOP 执行的具体方法(比如:获取用户登录信息,获取到则说明已登录)

通知又分为以下几种:

前置通知 @Before:通知⽅法会在⽬标⽅法调⽤之前执⾏。

后置通知 @After:通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。

返回通知 @AfterReturning:通知⽅法会在⽬标⽅法返回后调⽤。

异常通知 @AfterThrowing:通知⽅法会在⽬标⽅法抛出异常后调⽤。

环绕通知 @Around:通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执行自定义的行为。


4.连接点 (Join Point):所有可能触发切点的点(比如:所有接口)


Spring AOP 的实现


  1. 添加 Spring AOP 依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-bo
ot-starter-aop -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 定义切面:
@Aspect  //表明此类为一个切面
@Component   // 随着spring框架启动而启动
public class UserAspect {
}
  1. 定义切点:
@Aspect  //表明此类为一个切面
@Component   // 随着spring框架启动而启动
public class UserAspect {
  // 切点,这⾥使⽤ AspectJ 表达式语法
  //拦截 UserController 里所有方法
    @Pointcut("execution(* com.example.demo.controller.UserController.* (..))")
    public void pointcut(){   
    }
}
  1. 执行通知:

先将被拦截的类实现:


@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getuser")
    public String getUser() {
        System.out.println("do getUser");
        return "get User";
    }
    @RequestMapping("/deluser")
    public String delUser() {
        System.out.println("do delUser");
        return "del User";
    }
}
@Aspect  
@Component   
public class UserAspect {
    @Pointcut("execution(* com.example.demo.controller.UserController.* (..))")
    public void pointcut(){
    }
    //该前置通知针对于这个切点
    @Before("pointcut()")
    public void doBefore() {
        System.out.println("执行了前置通知");
    }
}

5b40e57585a47f7cb4eeec80c3b49455_d89234a0ecf74c6fb568f61baddabdbf.png

d3912d2b2b9574249c0a3bf1776e74d1_580792f6a0df4f828d86a8347cb646b7.png

确实是先执行前置通知,再执行被拦截的方法。


再来执行个后置通知:


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


再次访问:

7f0a13fda6b79264555ed79f87a7593a_80696f8bc72446d48da51210409d141e.png

9d1e81aabf414a394e4e9db766f3a5b5_4052d5efcac44aca933d781fda9c082d.png


环绕通知:


// 添加环绕通知
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint){
        Object obj = null;
        System.out.println("Around ⽅法开始执⾏");
        try {
            // 执⾏目标⽅法
            obj = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("Around ⽅法结束执⾏");
        return obj;
    }

087141469d38bfc58d2da2a540ad2415_c51c80c423744567be58fdca7ae4d7bf.png


c9e43d0b7ebba21d8f60c4197ade4ca8_8cc960dfc9b84a55b7607bb77e32121f.png

环绕通知是在最前面和最后面执行的。(在多线程中可以统计目标方法的执行时间,单线程下也可以使用前置通知和后置通知来统计)


Spring AOP 的实现原理


Spring AOP 是构建在动态代理基础上,因此 Spring 对 AOP 的⽀持局限于⽅法级别的拦截。


Spring 动态代理组成:


  1. JDK Proxy(代理对象必须实现接口,才能使用 JDK Proxy)
  2. CGLIB(通过实现代理类的子类来实现动态代理,被 final 修饰的类不能被代理)


JDK Proxy 和 CGLIB 区别:


  1. 实现不同:DK Proxy 要求代理类实现接口才能被代理,CGLIB 通过实现代理类的子类来实现动态代理
  2. 性能不同:JDK 7+ JDK Proxy 的性能高于 CGLIB,JDK 7 前则低于

相关文章
|
24天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
28 0
|
29天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
12天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
40 5
|
17天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
47 8
|
17天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
17天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
32 5
|
17天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
26 4
|
2月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
43 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
1月前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0