返回顶部
首页 > 资讯 > 后端开发 > Python >SpringAOP详解面向切面编程思想
  • 790
分享到

SpringAOP详解面向切面编程思想

2024-04-02 19:04:59 790人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 什么是 spring aop2. AOP 的组成2.1 切面 (Aspect)2.2 切点 (Pointcur)2.3 连接点 (Join Point)2.4 通知 (Ad

1. 什么是 Spring AOP

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

例如, 在没有学习AOP之前, 之前的判断当前登录状态, 就需要在每一个页面都实现登录校验, 在有了AOP之后, 外面只需在某一处配置以下, 所有的页面就都可以实现登录验证了, 就不需要写太多重复的代码,

Spring AOP, 是一个框架, 提高了一种对 AOP 思想的实现.

2. AOP 的组成

2.1 切面 (Aspect)

切面由切点和通知组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义.

切面是包含了: 通知, 切点和切面的类, 相当于 AOP 实现的某个功能的集合

2.2 切点 (Pointcur)

切点的作用就是提供一组规则 (使用 AspectJ pointcut expression language 来描述) 来匹配 连接点, 给满足规则的 连接点添加 Advice

切点相当于保存了众多连接点的一个集合

2.3 连接点 (Join Point)

应用执行过程中能够插入切面的一个点, 这个点可以是方法的调用时, 抛出异常时, 甚至修改字段时. 切面代码可以利用这些点插入到应用的正常流程之中, 并添加新的行为.

连接点相当于需要被增强的某个 AOP 功能的所有方法.

2.4 通知 (Advice)

定义了切面是什么, 何时使用, 其描述切面要完成的工作, 还解决何时执行这个工作的问题,

Spring切面类中, 可以在方法上使用以下注解, 会设置方法为通知方法, 在满足条件后会通知本方法进行调用.

⽅法进⾏调用:

前置通知使用 @Before:通知方法会在目标方法调用之前执行.

后置通知使用 @After:通知方法会在目标方法返回或者抛出异常后调用.

返回之后通知使用 @AfterReturning:通知方法会在目标方法返回后调用.

抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛出异常后调用.

环绕通知使用 @Around:通知包裹了被通知的方法, 在被通知的方法通知之前和调用之后执行自定义的行为.

3. Spring AOP 的使用

3.1 添加 AOP 框架

在 pom.xml 中添加依赖

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

3.2 定义切面和切点

@Aspect // 定义切面
@Component
public class UserAspect {
    // 切点 (配置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.UserController.*)")
    public void pointcut() {
        // 这是一个空方法, 不需要有具体的实现
    }
}

切点表达式注意事项

AspectJ 支持三种通配符

  • * : 匹配任意字符, 只匹配一个元素 (包, 类, 方法, 方法参数)
  • .. : 匹配任意字符,可以匹配多个元素, 在标识类时, 必须联合 * 使用
  • + : 表示按类型匹配指定类和所有类, 必须跟在类名后面, 如 com.cad.Car+, 表示继承该类的所有子类包括本身

execution() 是最常用的切点函数

语法为: execution(<修饰符> <返回类型> <包.类.方法(参数)> <异常>) (注意: 修饰符和异常可以省略)

示例:

  • execution(* com.cad.demo.User.*(..)) :匹配 User 类⾥的所有⽅法。
  • execution(* com.cad.demo.User+.*(..)) :匹配该类的⼦类包括该类的所有⽅法。
  • execution(* com.cad.*.*(..)) :匹配 com.cad 包下的所有类的所有⽅法。
  • execution(* com.cad..*.*(..)) :匹配 com.cad 包下、⼦孙包下所有类的所有⽅法。
  • execution(* addUser(String, int)) :匹配 addUser ⽅法,且第⼀个参数类型是 String,第⼆个参数类型是 int。

3.3 定义通知 (五种)

@Aspect // 定义切面
@Component
public class UserAspect {
    // 切点 (配置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {
        // 这是一个空方法, 不需要有具体的实现
    }
    @Before("pointcut()")
    public void doBefore(){
        System.out.println("执行 Before 方法");
    }
    @After("pointcut()")
    public void doAfter(){
        System.out.println("执行 After 方法");
    }
    @AfterReturning("pointcut()")
    public void doAfterReturning() {
        System.out.println("执行 AfterReturning 方法");
    }
    @AfterThrowing("pointcut()")
    public void doAfterThrowing() {
        System.out.println("执行 AfterThrowing 方法");
    }
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object object = null;
        System.out.println("Around 方法开始执行");
        try {
            // 执行拦截方法
            object = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("Around 方法结束执行");
        return object;
    }
}

正常时

抛出异常时

4. Spring AOP 实现原理

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

Spring AOP 是基于动态代理实现的.

动态代理分为两类:

  • JDK Proxy(JDK 动态代理机制)
  • CGLIB 动态代理

默认情况下, 实现了接口的类, 使用 AOP 会基于 JDK 生成代理类, 没有实现接口的类, 会基于 CGLIB 生成代理类

4.1 织入 (Weaving)

代理的生成时机

织⼊是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织⼊到目标对象中。

在目标对象的⽣命周期里有多个点可以进⾏织入:

  • 编译期:切面在目标类编译时被织⼊。这种⽅式需要特殊的编译器。AspectJ的织⼊编译器就是以这种方式织入切⾯的。
  • 类加载器:切⾯在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving. LTW)就支持以这种方式织入切面。
  • 运行期:切面在应用运行的某⼀时刻被织入。⼀般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象. Spring AOP 就是以这种方式织入切面的

4.2 JDK 和 CGLIB 实现的区别

  • JDK 实现要求被代理类必须实现接口, 之后是通过 InvocationHandlerProxy, 在运行时动态的在内存中生成了代理类对象, 该代理对象是通过实现同样的接口实现 (类似静态代理接口实现的方式), 只是该代理类是在运行期时,动态的织入统一的业务逻辑字节码来完成.
  • CGLIB 实现, 被代理类可以不实现接口, 是通过继承被代理类, 在运行时动态的生成代理类对象.

到此这篇关于Spring AOP详解面向切面编程思想的文章就介绍到这了,更多相关Spring AOP切面编程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringAOP详解面向切面编程思想

本文链接: https://lsjlt.com/news/151956.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringAOP详解面向切面编程思想
    目录1. 什么是 Spring AOP2. AOP 的组成2.1 切面 (Aspect)2.2 切点 (Pointcur)2.3 连接点 (Join Point)2.4 通知 (Ad...
    99+
    2024-04-02
  • SpringAOP面向切面编程
    文章目录 一. AOP是什么?二. AOP相关概念三. SpringAOP的简单演示四. SpringAOP实现原理 一. AOP是什么? AOP(Aspect Oriented Prog...
    99+
    2023-10-11
    java spring AOP 面向切面 动态代理
  • AOP面向切面编程思想。
    目录 一、AOP工作流程 1、基本概念 2、AOP工作流程  二、AOP核心配置 1、AOP切入点表达式 2、AOP通知类型 三、AOP通知获取数据 1、获取参数 2、获取返回值 3、获取异常  四、AOP事务管理 1、Spring事务简介...
    99+
    2023-09-06
    spring java 后端
  • 【Spring】面向切面编程详解(AOP)
    文章目录 一、AOP概述什么是AOPAOP应用场景 二、AOP的基本术语术语介绍术语举例详解 三、AOP实例说明四、通知类型详解概述前置通知后置通知环绕通知最终通知 六、AOP实现声明式事务...
    99+
    2023-08-30
    spring java 后端
  • 如何理解“面向对象”编程思想
    理解面向对象,首先理解要它的基础概念: 面向对象是将现实问题构建关系,然后抽象成 类 ( class ) ,给类定义属性和方法后,再将类实例化成 实例 ( instance ) ,通过访问实例的属性和调用方法来进行使用。 在不同的语言中,...
    99+
    2023-01-30
    面向对象 思想
  • Spring面向切面编程AOP详情
    目录1. 面向切面编程2. AOP核心概念3. AOP的实现4. Spring 对AOP支持4.1 支持@Aspect4.2 声明一个切面4.3 声明一个切入点4.4 声明增强5. ...
    99+
    2024-04-02
  • Java aop面向切面编程(aspectJweaver)案例详解
    面向切面编程的目的就是:在不改变别人的代码的前提下,在别人代码方法执行前或后,执行(切入自己的逻辑) 准备:idea+maven+aspectjweaver-1.8.9.jar ...
    99+
    2024-04-02
  • 解析Spring中面向切面编程
    目录一、AOP——另一种编程思想1.1、什么是 AOP1.2、为什么需要 AOP1.3、AOP 实现分类二、AOP 术语三、初步认识 Spring AOP3.1、Spring AOP...
    99+
    2024-04-02
  • JAVA:面向切面编程AOP
    一、定义         把某一些功能提取出来与某一对象进行隔离,提取之后可以对某哥单方面的功能进行修改和扩展         也就是把众多方法中的的所有公共代码抽取出来,放到某个地方集中管理         对业务逻辑的各个部分进行了隔离...
    99+
    2023-09-12
    java AOP
  • spring6-AOP面向切面编程
    面向切面编程AOP 1、场景模拟1.1、声明接口1.2、创建实现类1.3、创建带日志功能的实现类1.4、提出问题 2、代理模式2.1、概念2.2、静态代理2.3、动态代理2.4、测试 ...
    99+
    2023-10-21
    java 后端 spring aop 面向切面编程
  • 什么是js面向对象编程思想
    什么是js面向对象编程思想,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着像Node.js这类技术的出现,你现在可以在服务器...
    99+
    2024-04-02
  • 【JavaSE】面向对象编程思想之继承
     【本节目标】 继承 组合 目录 1. 为什么需要继承 2. 继承概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. 子类构造方法 7....
    99+
    2023-09-03
    java 开发语言 学习方法
  • “PHP面向对象编程进阶指南:掌握面向对象编程思想”
    面向对象编程的基础知识 类: 类是面向对象编程的基本构建块。它定义了对象的属性和方法。 对象: 对象是类的实例。它具有类的所有属性和方法。 方法: 方法是类定义的行为。它可以访问对象的属性,并对它们进行操作。 属性: 属性是类的状态。...
    99+
    2024-02-25
    PHP 面向对象编程 对象 方法 属性
  • Python 切面编程秘籍:揭开面向切面编程的奥秘
    ...
    99+
    2024-04-02
  • 浅谈Python面向对象编程oop思想心得
    花了几个小时给小表弟普及了一下OOP的知识,索性总结一下写篇文章。 OOP全称Object Oriented Programming 即面向对象编程,之所以有这么一个奇怪的称呼,是因...
    99+
    2024-04-02
  • Java语言面向对象编程思想之类与对象实例详解
    在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧。首先我们来简单的阐述面向对象的思想。面向对象:官方的语言很抽象,我们把官方的解释和定义抛开。想想,自己有什么,对!!我们自己有手...
    99+
    2023-05-31
    java 面向对象 之类
  • Java面向切面编程怎么实现
    在Java中实现面向切面编程,可以使用以下几种方式:1. 使用代理模式:通过创建代理类,将横切逻辑封装在代理类中,然后在实际业务类中...
    99+
    2023-08-08
    Java
  • Spring超详细讲解面向对象到面向切面
    目录前言一.OOP&AOP二.AOP核心三.第一个AOP案例1.环境准备2.AOP实现步骤四.切入点表达式1.语法格式2.通配符五.AOP通知类型环境准备环绕通知1.返回后通...
    99+
    2022-11-13
    Spring 面向对象 Spring 面向切面
  • 揭秘 Python 面向切面编程的神秘面纱
    ...
    99+
    2024-04-02
  • Javascript中怎么实现面向切面编程
    本篇文章为大家展示了Javascript中怎么实现面向切面编程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。面向切面编程(Aspect-oriented progr...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作