【Spring】19 AOP介绍及实例详解

文章目录

    • 1. 定义
      • 1)什么意思呢?
      • 2)如何解决呢?
    • 2. 基本概念
      • 1)切面(Aspect)
      • 2)切点(Pointcut)
      • 3)通知(Advice)
      • 4)连接点(Join Point)
      • 5)织入(Weaving)
    • 3. 例子
      • 1)添加依赖
      • 2)定义一个测试类
      • 3)创建切面
      • 4)创建启动类
      • 5)运行应用程序
    • 4. 将 [基本概念] 和 [例子] 结合解释说明
    • 总结

Spring 框架提供了强大的面向切面编程(AOP)支持,使得我们能够更方便的实现横切关注点的功能,比如日志记录、事务管理等。本文将深入探讨 Spring AOP 的概念、原理以及如何在应用程序中应用 AOP。

1. 定义

AOP 是一种编程范式,它允许将横切关注点与业务逻辑分离。横切关注点是那些跨足多个模块的关注点,比如日志、事务、方法执行时间等。通过 AOP 我们可以在不修改原始业务逻辑代码的情况下,将这些关注点模块化。

1)什么意思呢?

概念往往都是让人读不懂的,接下来让我们来举例说明一下:

首先看看我们的需求是什么呢?我们在实际开发过程中会写了无数个方法,想在每个方法开头和结束打印一下日志,例如某某方法开始了和某某方法结束了。

如下图这样:

在这里插入图片描述

是不是可以很清晰的发现一个问题,有无数个方法我们就需要在无数个方法里面分别加上这两个代码。。。

2)如何解决呢?

使用 AOP 面向切面编程,统一来一下。这就好像我们想把一些纸剪成两半似的,一张一张的剪就很慢(和上面现象一样),我们可以给它们摞起来然后用剪刀一刀下去,咔!全部剪开(AOP面向切面编程)。

就变成了下图这样:

在这里插入图片描述

是不是突然发现爽歪歪啦!

2. 基本概念

1)切面(Aspect)

切面是一种模块化的单元,它包含了横切关注点的实现,在 Spring AOP 中,切面是由切点和通知组成的。

2)切点(Pointcut)

切点定义了在何处应用切面的规则,它是一个表达式,用于匹配连接点(在应用中执行的特定代码位置),切点决定了切面在哪里生效。

3)通知(Advice)

通知是切面的具体实现,它定义了在何时、何地、以及如何应用切面的逻辑。常见的通知类型包括前置通知、后置通知、异常通知、最终通知和环绕通知。

4)连接点(Join Point)

连接点是在应用中执行的特定代码位置,如方法调用、方法执行、异常抛出等,它是切点的实际执行实例。

5)织入(Weaving)

织入是将切面应用到目标对象并创建代理对象的过程。织入可以在编译时、类加载时、运行时进行。

3. 例子

1)添加依赖

pom.xml 中添加 spring-aopaspectjweaver 两个依赖(这里只写了本次新添加的两个)

        <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.20.1</version></dependency>

2)定义一个测试类

创建一个简单的业务类,例如 DemoController ,其中包含一个待切入的方法

package com.cheney.koala.controller;import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {public void print(){System.out.println("Hello");}
}

3)创建切面

创建一个切面类,例如 LoggingAspect ,用于定义在方法执行前后打印日志的通知

package com.cheney.koala.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {@Pointcut("execution( * com.cheney.koala.controller.*.*(..) )")public void demoActionExecution() {}@Before("demoActionExecution()")public void logBefore(JoinPoint joinPoint) {System.out.println("方法 " + joinPoint.getSignature().getName() + " 开始啦");}@After("demoActionExecution()")public void logAfter(JoinPoint joinPoint) {System.out.println("方法 " + joinPoint.getSignature().getName() + " 结束啦");}
}

在这个切面中,我们使用 @Aspect 注解标识这是一个切面类。

@Pointcut("execution( * com.cheney.koala.controller.*.*(..) )") 这句代码是一个 Spring AOP 中的切点表达式,用于定义在哪些方法上应用切面。

  • @Pointcut:这是一个注解,用于定义切点,即在哪些方法上应用切面
  • execution:这是切点表达式的一部分,表示匹配方法的执行
  • *:这是通配符,表示匹配任意返回类型的方法
  • com.cheney.koala.controller:这是包名,表示匹配该包下的所有类
  • *.*(..):这也是通配符,表示匹配该包下所有类的所有方法

因此,整个表达式的意思就是匹配 com.cheney.koala.controller 包下所有类的所有方法,无论返回类型和参数类型是什么,都是我想切的对象(也即前后加入方法开始和方法结束的日志)

@Before@After 注解的通知方法中,使用 JoinPoint 获取连接点信息,包括方法签名等

4)创建启动类

KoalaApplication.java 中,添加了默认启动后调用 DemoController 里的 print 方法,仅仅是为了测试方便,没有别的特殊用意。

package com.cheney.koala;import com.cheney.koala.controller.DemoController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class KoalaApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(KoalaApplication.class, args);DemoController demo = context.getBean(DemoController.class);demo.print();}
}

5)运行应用程序

运行应用程序,你将看到如下输出

在这里插入图片描述

方法 print 开始啦
Hello
方法 print 结束啦

这表明我们成功地通过 AOP 切面在方法执行前后分别打印了日志

4. 将 [基本概念] 和 [例子] 结合解释说明

在这里插入图片描述

  • **切面 **

    使用 @Aspect 注解标识这是一个切面类。在类中使用 @Pointcut 注解定义了一个切点 demoActionExecution,用于匹配我想切的对象

  • 切点

    execution( * com.cheney.koala.controller.*.*(..) ) 表示 com.cheney.koala.controller 包下所有类的所有方法,无论返回类型和参数类型是什么,都是我想切的对象

  • 连接点

    使用 JoinPoint 获取连接点信息,包括方法签名等

  • 通知

    使用 @Before@After 注解定义了两个通知方法,分别在方法执行前后执行

  • 织入

    在运行时,Spring AOP 将切面织入目标对象的方法中,从而在方法执行前后执行通知

总结

通过 Spring AOP,我们能够将关注点(如日志记录)与业务逻辑分离,使得代码更加清晰、可维护。在实际应用中,AOP 可以应用于诸如事务管理、安全性、性能监控等方面,为应用程序提供更高的可扩展性和可维护性。本文通过一个日志打印的例子,详细介绍了在 Spring AOP 中切面、切点、通知、连接点和织入的概念,并成功地使用 AOP 实现了在方法执行前后分别打印日志的功能。这种方式帮助我们实现了横切关注点的代码重用,提高了代码的可维护性和可读性,也希望通过本文的介绍,可以将 AOP 应用到具体项目开发中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/318826.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql生成数据库字典文档

项目交付离不开项目数据库字典文档。下面用python轻松生成交付文档字典。 一 生成doc文档数据库字典效果&#xff1a; 1 生成doc文件&#xff0c;如下图&#xff1a; 2 打开文件字典格式内容 &#xff0c;如下图&#xff1a; 二 python生成doc字典文档代码 生成doc数据库字典…

我的创作纪念日三年收获和感悟

机缘 我刚开始接触创作也是最近几年开始&#xff0c;当初就是希望自己的收获分享给大家&#xff0c;不仅使自己成长&#xff0c;也可以带着大家一起成长&#xff0c;独乐乐不如众乐乐&#xff0c;人都是自私的以前我都是看到好的知识文章都是自己藏起来&#xff0c;发现收获的…

基于ssm食品安全追溯系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本食品安全追溯系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

基于SSM实验室排课系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

Linux内核源码下载与在线浏览10种方式

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【设计模式】二十一.行为型模式之状态模式

状态模式 一. 说明 状态模式通常描述一个类不同行为的多个状态变更&#xff0c;对象的行为依赖它的状态&#xff0c;它是一种行为型模式。 状态模式可以用来消除代码中大量的if-else结构&#xff0c;它明确对象是有状态的、对象的不同状态对应的行为不一样、行为之间是可以切…

鸿蒙开发学习——基本组件

文章目录 引言正文Image组件设置加载网络图片图片属性设置 Text组件设置文本显示内容text属性设置 TextInput输入文本TextInput Controller获取输入文本 Button按钮 引言 最近在学习鸿蒙系统开发&#xff0c;然后对着文档看还是有很多问题&#xff0c;这里结合官方给的demo进行…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的掉线自动重连的技术背景通过PnP事件函数检查Baumer工业相机是否掉线在NEOAPI SDK里实现相机掉线重连方法&#xff1a;工业相机掉线重连测试演示图 …

魔改版小市值策略

策略思路 最近几年&#xff0c;小市值策略一直都收益不错&#xff08;当然&#xff0c;不包含17年和18年&#xff09;。小市值因子对收益的影响是很大的。特别是行情不好的时候&#xff0c;大家都忙着炒作热点&#xff0c;那么这时候符合题材的小市值更加符合炒作标准了。 为…

《使用ThinkPHP6开发项目》 - ThinkPHP6创建菜单模块

#CSDN 年度征文&#xff5c;回顾 2023&#xff0c;赢专属铭牌等定制奖品# 一、创建菜单模块 1、创建系统菜单表 CREATE TABLE menu (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 菜单ID,menu_name varchar(32) NOT NULL DEFAULT COMMENT 菜单名称,path varchar(2…

技术学习|CDA level I 描述性统计分析(常用的数据分布)

推断性统计分析方法的基础理论——常用的分布&#xff08;两点分布、二项分布、正态分布[含标准正态分布]、χ2分布、t分布、F分布。 随机试验&#xff1a;结果不确定的实验&#xff0c;例如&#xff0c;进行一次抛硬币实验&#xff0c;结果是不确定的。对于随机试验的结果&am…

EM算法公式详细推导

EM算法是什么&#xff1f; EM算法是一种迭代算法&#xff0c;用于含隐变量概率模型参数的极大似然估计&#xff0c;或极大后验概率估计。EM算法由两步组成&#xff1a;E步&#xff0c;求期望&#xff1b;M步&#xff1a;求极大。EM算法的优点是简单性和普适性。 符号说明&…