【Spring全家桶系列】面向切面编程AOP

news2024/11/23 6:40:46

⭐️前面的话⭐️

本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍面向切面编程的思想和相关概念,附加一个小案例。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年5月12日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《无》
💬参考在线编程网站:🌐牛客网🌐力扣🌐acwing
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

    • 1.什么是面向切面编程
    • 2.AOP的作用
    • 3.理解面向切面编程
      • 3.1连接点,切点,切面,通知
      • 3.2SpringAOP的实现原理


封面


1.什么是面向切面编程

认识面向切面编程之前,我们先来说说另外两个概念,相信对于学习计算机的小伙伴们,一定是认识的。

面向过程编程,这个熟悉吧,相信很多小伙伴都学习过C语言,C语言就是一门面向过程的语言,重点在于将一个任务按照步骤进行拆解,即分析解决问题的步骤,然后按照步骤将每一步使用函数封装,最后按照顺序一步步执行,这就是面向过程,它突出的重点是过程。

面向对象编程,这个应该也很常见吧,面向对象与面向不同的是,面向对象在解决问题之前,会把问题中的各个事物抽象出来,这些抽象出来的事物就叫做类模板,通过模板将事物实例出来就成了对象,建立对象的目的并不在于为了完成某一个步骤,而是为了方面描述某个某个事物在问题中的行为特征。

干说有点抽象,举个栗子吧,假设在下五子棋,那按照面向过程的思路就是开始游戏,黑子落子,描述画面,白子落子,描述画面,…,最终某方连成五子,获得游戏胜利。

面向对象的思路,先将五子棋中的事物进行抽象,五子棋用到的事物有黑白双方,黑白子棋子,棋盘,规则,先将这些事物抽象成类,每个类负责不同的功能模块,黑白双方类负责描述玩家的行为,也就是我们玩家下棋时候的行为,棋子类描述下五子棋时的棋子,棋盘类充当五子棋中下棋棋盘,规则类就是描述游戏的规则,然后基于这些类,根据需要实例化对象,来完成描述下五子棋这一行为。

如我们需要两个玩家,就实例出两个玩家,每个玩家有自己的信息和动作,在面向对象语言当中,信息使用属性来描述,动作使用方法来描述,当轮到某一玩家下棋时,就调用该玩家对应的方法来充当它这个下棋的动作,下棋过程中会显示玩家信息,通过获取玩家对象的属性就能将信息展现出来。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。

面向过程编程与面向对象编程都是算一种编程的思想,或者说是编程的规范。而对于面向切面过程(Aspect Oriented Programming),简称AOP,它也是一种编程思想。

前面介绍Spring框架的时候,强调过,Spring中有一个核心的模块,就是AOP。

想要理解AOP到底是什么还得了解几个概念,现在只能说它是一种编程思想,它能够在不改原有代码的前提下对其功能进行增强。

就是你代码已经写好了,使用AOP可以在不改动代码的前提下增强功能,如对于一个功能,可以基于AOP完成对该功能执行效率的计算,能够在功能正式执行前或者执行后,添加其他的功能执行,能够在该功能发生异常后,对其异常进行处理。

2.AOP的作用

一句话,在不惊动原始设计的基础上为其进行功能增强。

实现上,就是基于动态代理进行实现。

想象一个场景,我们在做后台系统时,除了登录和注册等几个功能不需要做用户登录验证之外,其他几乎所有页面都需要先验证用户登录的状态,那这个时候我们要怎么处理呢?

如果不使用AOP,我们就需要在每一个Controller层都写一遍验证用户是否已经登录的程序,如果你实现的功能有很多,并且这些功能都需要进行登录验证,那你就需要编写大量重复的代码,非常的麻烦,尽管你可以将登录验证实现的逻辑封装在一个方法中,但是你要在很多地方调用这个方法,还是很麻烦。

如果使用AOP,在进入核心的业务代码之前会做统一的一个拦截,去验证用户是否登录,这样就很方便,仅需做一个拦截工作,再将验证代码一执行即可。

除了登录验证功能之外,还有很多功能也可以使用AOP,比如:

  • 统一日志记录与持久化。
  • 统一方法执行时间统计。
  • 统一数据返回格式。
  • 统一处理程序中的异常。
  • 统一事务的开启与提交。

也就是说使用 AOP 可以扩充多个对象的某个能力,所以 AOP 可以说是 OOP (Object Oriented Programming,面向对象编程)的补充和完善。

3.理解面向切面编程

3.1连接点,切点,切面,通知

想要理解面向切面过程,那先得搞清楚几个概念,我们以实际的例子来进行说明,假设我们需要做一个增强功能,就是测定任意一个一方法的运行时间,当然最容易想到的最粗暴的方式就是在每一个方法当中加上这个测定功能,实现逻辑也很简单,执行业务代码前先获取一个时间戳,执行完毕后再获取一个时间戳,然后一相减,得到的就是程序的运行时间。

1

但是这样太麻烦了,每个方法中你都写一个实现不得累死,而基于AOP能够不改动任何的源代码,完成该功能的实现。

假设我们有以下的方法需要进行功能增强:

@Controller
public class AddController {
    public void adding() {
        int a = 1;
        for (int i = 1; i <= 1000000; i++) {
            a++;
        }
        System.out.println("增加百万次操作!");
    }
    public void addPlus() {
        //记录执行前程序的时间戳
        long start = System.currentTimeMillis();
        adding();
        //记录完成任务后程序的时间戳
        long end = System.currentTimeMillis();
        System.out.println("Plus:增加百万次操作!,时间为:" + (end - start) + "ms");
    }
    public void playing() {
        System.out.println("playing ... ...");
    }
    public void running() {
        System.out.println("running ... ...");
    }
    public void sharing() {
        System.out.println("sharing ... ...");
    }
}

其中的addPlus方法就是通过手动实现的方式完成执行时间的计算,下面我们来一步一步说明在不改动代码的情况下,完成对其他方法执行时间的统计。

通过手动实现统计的方式肯定是没有问题的,执行效果如下:

2

基于AOP实现的效果:

3
通过使用AOP,在不改变任意原代码就可以实现对方法的功能进行增强。

下面来介绍一组概念,这些都是AOP的专用术语:

  • 连接点,所谓连接点,就是指程序能够运行到的任意位置,不限于方法,异常,属性,类,对象等,通俗点说,就是程序执行到任意一句代码的位置,对于任意一个位置,就叫做连接点,你所选的位置包含范围越大,则该连接点的粒度也就越大,如直接选择一个类作为连接点,那这个连接点的粒度就比较大,选择方法作为连接点,这个连接点的粒度就越小,粒度选择的越小,对功能的增强就越精准,在spring当中连接点可以理解为方法的执行。
  • 切点,需要进行功能增强的连接点即切点,说白了,就是你准备对某个方法进行功能增强,那这个方法就是一个切点,很明显连接点包含切点。
  • 通知,执行功能增强的一段代码就是通知,通常都是将其封装成方法,这个实现功能增强的方法就是通知。
  • 通知类,通知所处的类就是通知类。
  • 切面,通知与切点的连接就是切面,通知有了,切点有了,将这两者建立的连接关系就是切面。

下面用几张图和代码来描述这几个核心概念:

连接点即所有的方法,切点就是被增强的方法。
4

通知就是实现增强功能的方法,通知所在类即通知类。
5

关系图:
6
在Spring中一个切点可以匹配一个方法,也可以匹配多个方法。

通知包含前置通知,后置通知,返回之后通知,抛异常后通知与环绕通知五类。

在Spring切面类中,可以在方法上使用以下注解,会设置方法为通知方法,在满足条件后会调用对应满足条件的方法:

  • 前置通知使用@Before∶通知方法会在目标方法调用之前执行。
  • 后置通知使用@After∶通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用@AfterReturning∶ 通知方法会在目标方法返回后调用。
  • 抛异常后通知使用@AfterThrowing∶ 通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用@Around∶通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。

后续文章会说明这几类通知如何使用。

3.2SpringAOP的实现原理

AOP是一种编程思想,而SpringAOP是AOP的一种实现。

AOP的实现本质上就是基于代理实现的,下面来简单说下原理。

首先,要有一个目标对象,在上面的例子中,目标对象就是addController,然后通过基于这个目标对象,创建一个代理类,并在某一规定的时机生成,这个时机就是织入,最后在在这个代理类上加上以下增强的方法,这个过程就叫做引入

下面又出来了一组相关概念:

  • 目标对象:代理的目标对象。
  • 织入(weaving): 即代理的生成时机,织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入∶
    • 编译期∶切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
    • 类加载器∶切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving.LTW)就支持以这种方式织入切面。
    • 运行期∶切面在应用运行的某一时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象。SpringAOP就是以这种方式织入切面的。
  • 引入(introduction)
    在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Kubernetes集群构建大中型企业CICD应用平台(2)--code阶段工具gitlab安装

这里我们为gitlab服务器准备一台虚拟机&#xff1a;192.168.19.6-gitlab服务器 在code阶段&#xff0c;我们需要将不同版本的代码存储到一个仓库中&#xff0c;常见的版本控制工具就是SVN或者Git&#xff0c;这里我们采用Git作为版本控制工具&#xff0c;GitLab作为远程仓库。…

django常用命令/vue-cli图形化界面创建方式/vueo-cli命令行创建方式/若依框架/elementui

django常用命令 django-admin.exe startproject mysite python .\manage.py startapp app01 python manage.py makemigrations python manage.py migrate python manage.py runserver python manage.py runserver 0.0.0.0:8000 from django.shortcuts import render,Http…

【Linux学习】多线程——同步 | 条件变量 | 基于阻塞队列的生产者消费者模型

多线程——同步 | 条件变量 | 基于阻塞队列的生成者消费者模型 &#x1f3d3;生产者消费者模型&#x1f3f8;同步概念&#x1f3f8;生产者消费者模型的特点 &#x1f3d3;同步的应用&#x1f3f8;条件变量&#x1f3f8;条件变量接口 &#x1f3d3;基于阻塞队列的生产者消费者模…

文心一言 VS chatgpt (16)-- 算法导论4.1 1~2题

一、当A的所有元素均为负数时&#xff0c;FIND-MAXIMUM-SUBARRAY返回什么? 文心一言&#xff1a; 当A的所有元素均为负数时&#xff0c;FIND-MAXIMUM-SUBARRAY返回-1。 这是因为在二进制中&#xff0c;当所有元素均为负数时&#xff0c;A的每个元素都对应一个负数&#xff…

基于Kubernetes集群构建大中型企业CICD应用平台(4)--Operate阶段工具

还是在192.168.19.7-CentOS-7.6-jenkins-new这台服务器上进行操作 部署过程&#xff0c;会采用Docker进行部署&#xff0c;暂时只安装Docker即可&#xff0c;后续还需安装Kubenetes 4.1 Docker安装 准备测试环境&生产环境 下载Docker依赖组件 # yum -y install yum-uti…

vue+express+mysql做一个简单前后端交互,从数据库中读取数据渲染到页面

1.下载上次的包 npm I &#xff0c;同时下载新的包 axios 2.打开数据库服务器&#xff0c;同时使用新建数据库一样&#xff0c;数据包名 3.新建一个项目 4.全局注册axios 5.新建一个server文件夹&#xff08;里面在建一个index.js的主文件&#xff09;用来放我们后端写的东西 …

设计模式——单一职责模式之桥模式

文章目录 前言一、“单一职责” 模式二、Bridge 桥模式1、动机2、模式定义3、伪代码示例4、结构 总结 前言 一、“单一职责” 模式 在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随着需求的变化&#xff0c;子类急剧膨胀&#xff…

【C++STL】map/set源码封装简单分析

文章目录 一. 问题的抛出二. 红黑树的实现三. map/set实现四. 分析五. KeyOfValue仿函数结束语 一. 问题的抛出 我们知道C的STL中map和set的底层都是红黑树。 但是仔细思考一下&#xff0c;map是存储键值对&#xff0c;也就是Key_Value模型 而set是Key的模型 那么STL中的红黑树…

apisdk-starter自动装配的思路与应用

apisdk-starter整体思路 首先定义开发者定义的开放接口声明为原始类&#xff0c;javassist生成的类是增强类。 使用springboot的EnableAutoConfiguration和Import触发Spring扫描组件扫描原始类&#xff0c;得到所有BeanDefinition拓展FactoryBean&#xff0c;构造函数的参数为…

力扣算题Day20

98.验证二叉搜索树(了解二叉树的性质,才是编写此道题代码的基础) 做题伤着了&#xff1a;这道题我做的时候&#xff0c;看到别人写的代码很长&#xff0c;懒得看&#xff0c;直接干。自己编写代码&#xff0c;没有了解平衡二叉树的性质&#xff0c;然后出现了下图[0,-1]、[0]的…

落地页设计的营销心理学(一)

营销落地页的作用&#xff0c;是为了促进目标用户转化。但如何提升转化率&#xff0c;这就需要我们了解用户在浏览落地页行为背后的动机、心理活动是什么&#xff0c;才能更好地制定营销策略。 营销心理学是指应用心理学原理来解释、预测和影响人们购买决策的一门学科。在落地页…

Goby 漏洞更新 |华视私云-CDN直播加速服务器默认口令漏洞

漏洞名称&#xff1a;华视私云-CDN直播加速服务器默认口令漏洞 English Name&#xff1a;Sinovision Cloud CDN live default passwd CVSS core: 6.5 影响资产数&#xff1a;737 漏洞描述&#xff1a; 华视私云-CDN直播加速服务器是一款用于CDN直播加速的服务器。华视私云…

Restormer Efficient Transformer for High-Resolution Image Restoration论文代码运行记录

文章目录 Restormer代码训练和测试运行记录文章及代码地址1. 所需环境2. 配置环境3. 安装gdrive以便下载数据集4. 放置权重文件5. 运行Demo运行单图像散焦去模糊训练、测试 Restormer代码训练和测试运行记录 文章及代码地址 文章名称&#xff1a;Restormer: Efficient Transf…

获取cookies的方法及使用postman进行接口关联

第一种获取cookies的方式 看有没有专门的登录测试地址&#xff0c;访问来获取cookie信息&#xff0c;然后将cookie信息粘贴到header里面 第二种获取cookies的方式 在登录前&#xff0c;提前打开审查元素&#xff0c;然后输入账号密码后&#xff0c;点击登录&#xff0c;就可…

刚来起薪就18K,公司刚来的00后真是卷王....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(一)

博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.了解什么是抽象类&#xff0c;什么是接口&#xff1b; 2.掌握抽象类和接口的定义方法&#xff1b; 3.理解接口和抽象类的使用场景&#xff1b; 4.掌握多态的含义和用法&#xff1b; 5.掌握内部类的定义方法和使用…

数字孪生应用 | 3D可视化技术助力智慧煤矿建设,提升煤矿生产效率

智慧煤矿数字孪生可视化平台是一种利用现代信息技术手段&#xff0c;对煤矿的生产过程进行实时监测、管理和控制的系统。它能够将煤矿内的数据、信息、图像等多种信息整合在一起&#xff0c;通过3D可视化的方式呈现给煤矿管理者和工作人员&#xff0c;帮助他们更好地了解煤矿的…

mysql读写分离实验

amoeba服务器 mkder amoeba tar xf amoba- mysql-binary-2. 2.0.tar.gz -C amoeba mv amoeba /usr/local 解压jdk mv jdk1.6 /usr/local/jdk1.6 vim /etc/profile export JAVA_home/usr/local/jdk1.6 export CLASSPATH.:$JAVA_HOME/lib:$JAVE_HOME/jre/lib export AM…

SpringBoot+myBatis(plus)+MySQL+VUE最基础简易的前后端全栈demo制作

网站全栈制作&#xff1a; 一&#xff1a;后端 为了跟公司后端更好的扯皮&#xff08;不是&#xff09;&#xff0c;本人决定学一下java语言的后端接口书写。 项目制作&#xff1a;后端采用SpringBootmyBatis(plus)mysql&#xff08;IDE为IDEA软件&#xff09;。前端采用Vue…

奶爸式Swagger教学

目录 一、导入依赖 二、SwaggerConfig基础编程 三、Swagger 常用说明注解 1.API 2.ApiOperation 3.ApiModel 4.ApiModelProperty 5.ApiParam 6.ApilmplicitParam 一、导入依赖 <!--开启Swagger --><!-- https://mvnrepository.com/artifact/io.springf…