Spring-AOP-面向切面编程

news2025/1/18 9:02:39

文章目录

目录

文章目录

前言

一 . 场景设定和问题复现

二 . 解决技术[代理模式]

2.1 代理模式

2.2 静态代理

2.3 动态代理

三 . 面向切面编程思想(AOP)

3.1 面向切面编程思想

3.2 AOP 思想的应用场景

3.3 AOP术语名词介绍 

3.3.1 横切关注点

3.3.2 通知(增强)

3.3.3 连接点

3.3.4 切入点

3.3.5 切面

3.4 Spring AOP框架介绍

四 . Spring AOP框架注解方式实现

4.1 Spring AOP底层技术组成

4.2 执行流程

4.3 AOP注解 

4.4 入门案例

4.5 切入点表达式

4.6 AOP通知获取数据

4.7 切面优先级设置

总结


前言

大家好,这篇博客给大家介绍一下spring家族中的一门框架技术aop框架


一 . 场景设定和问题复现

假如我们有以下四个方法

不难看出这四个方法中重复的代码有核心操作之前的代码和核心操作之后的代码

代码问题分析

1. 代码缺陷

  • 对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力
  • 附加功能代码重复,分散在各个业务功能方法中!冗余,且不方便统一维护!

2. 解决思路

  • 核心就是:解耦。我们需要把附加功能从业务功能代码中抽取出来。
  • 将重复的代码统一提取,并且[[动态插入]]到每个业务方法!

3. 技术困难

  •     解决问题的困难:提取重复附加功能代码到一个类中,可以实现
  •     但是如何将代码插入到各个方法中,我们不会,我们需要引用新技术[代理模式]!!!

二 . 解决技术[代理模式]

2.1 代理模式

  二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。

无代理场景:

有代理场景:

相关术语:

  • 代理:将非核心逻辑剥离出来以后,封装这些非核心逻辑的类、对象、方法。(中介)
    • 动词:指做代理这个动作,或这项工作
    • 名词:扮演代理这个角色的类、对象、方法
  • 目标:被代理套用了核心逻辑代码的类、对象、方法。(房东)
  • 代理在开发中实现的方式具体有两种:静态代理,[动态代理技术]

2.2 静态代理

静态代理是在编译时就已经确定了代理类和被代理类的关系,代理类和被代理类在编译期间就已经确定下来了。在静态代理中,代理类和被代理类都需要实现同一个接口或者继承同一个父类,并且代理类中持有一个对被代理类的引用,在代理类中对被代理类的方法进行增强或者添加额外的逻辑。

简单来说,就是我们需要自己编写代理类! 不用我多说,都知道这个肯定不行,代码被我们写死了,太不优雅!

2.3 动态代理

动态代理是在运行时动态生成代理类,代理类和被代理类的关系是在运行时确定的。在动态代理中,代理类不需要事先知道具体的被代理类,而是在运行时根据需要动态生成代理类。动态代理通常使用Java的反射机制来实现,在运行时生成代理类,代理类中的方法调用会被转发到真正的被代理对象上。

动态代理技术分类

  • JDK动态代理:JDK原生的实现方式,需要被代理的目标类必须 实现接口!他会根据目标类的接口动态生成一个代理对象!代理对象和目标对象有相同的接口!(拜把子)
  • cglib:通过继承被代理的目标类实现代理,所以不需要目标类实现接口!(认干爹)

不管是使用动态代理技术还是静态代理技术,我们都是需要编写代码的,程序员的工作都比较繁琐

那么有没有更好的方法来解决这个问题? 答案是肯定的,那就是AOP框架


三 . 面向切面编程思想(AOP)

3.1 面向切面编程思想

AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

3.2 AOP 思想的应用场景

AOP(面向切面编程)是一种编程范式,它通过将通用的横切关注点(如日志、事务、权限控制等)与业务逻辑分离,使得代码更加清晰、简洁、易于维护。AOP可以应用于各种场景,以下是一些常见的AOP应用场景:

1. 日志记录:在系统中记录日志是非常重要的,可以使用AOP来实现日志记录的功能,可以在方法执行前、执行后或异常抛出时记录日志。
2. 事务处理:在数据库操作中使用事务可以保证数据的一致性,可以使用AOP来实现事务处理的功能,可以在方法开始前开启事务,在方法执行完毕后提交或回滚事务。
3. 安全控制:在系统中包含某些需要安全控制的操作,如登录、修改密码、授权等,可以使用AOP来实现安全控制的功能。可以在方法执行前进行权限判断,如果用户没有权限,则抛出异常或转向到错误页面,以防止未经授权的访问。
4. 性能监控:在系统运行过程中,有时需要对某些方法的性能进行监控,以找到系统的瓶颈并进行优化。可以使用AOP来实现性能监控的功能,可以在方法执行前记录时间戳,在方法执行完毕后计算方法执行时间并输出到日志中。
5. 异常处理:系统中可能出现各种异常情况,如空指针异常、数据库连接异常等,可以使用AOP来实现异常处理的功能,在方法执行过程中,如果出现异常,则进行异常处理(如记录日志、发送邮件等)。
6. 缓存控制:在系统中有些数据可以缓存起来以提高访问速度,可以使用AOP来实现缓存控制的功能,可以在方法执行前查询缓存中是否有数据,如果有则返回,否则执行方法并将方法返回值存入缓存中。
7. 动态代理:AOP的实现方式之一是通过动态代理,可以代理某个类的所有方法,用于实现各种功能。


3.3 AOP术语名词介绍 

3.3.1 横切关注点

从每个方法中抽取出来的同一类非核心业务,在同一个项目中,我们可以使用多个横切关注点对相关放法进行不同层面的增强

核心关注点(Core Concerns)是指程序的主要功能和业务逻辑,它是程序的核心部分,与程序的业务目标直接相关。核心关注点是程序的主要目标,它决定了程序的正确性和功能完整性。通过将横切关注点与核心关注点分离,可以使得核心关注点的代码更加清晰、简洁,易于理解和维护。同时,横切关注点的代码可以在多个地方进行重复使用,提高了代码的可重用性和可维护性。通过AOP的方式管理横切关注点,可以使程序的结构更加清晰,提高代码的可维护性和可测试性

3.3.2 通知(增强)

通知定义了在目标对象的方法执行前、执行后、抛出异常时等特定的时机,执行横切关注点的代码逻辑。通知可以在目标对象的方法执行前、执行后、抛出异常时等不同的时机进行执行。

每一个横切关注点上要做的事情都需要写一个方法来实现,这样的方法就叫通知方法。

AOP中定义了几种常见的通知类型:

  1. 前置通知(Before Advice):在目标对象的方法执行前执行的通知。可以在前置通知中进行一些准备工作,例如参数校验、权限检查等。

  2. 后置通知(After Advice):在目标对象的方法执行后执行的通知。可以在后置通知中进行一些清理工作,例如释放资源、记录日志等。

  3. 返回通知(After Returning Advice):在目标对象的方法执行后并且成功返回结果时执行的通知。可以在返回通知中获取方法的返回值,并进行一些后续处理。

  4. 异常通知(After Throwing Advice):在目标对象的方法抛出异常时执行的通知。可以在异常通知中捕获并处理异常,或者进行一些异常处理的逻辑。

  5. 环绕通知(Around Advice):在目标对象的方法执行前后都执行的通知。环绕通知可以完全控制目标对象方法的执行过程,可以在方法执行前进行一些预处理,然后决定是否继续执行目标方法,最后在方法执行后进行一些后续处理。

3.3.3 连接点

连接点(Join Point)是AOP中的一个概念,表示在程序执行过程中可以插入通知的特定点。也可以说,连接点是程序中可以应用通知的位置。

在一个应用程序中,连接点可以是方法的执行、方法的调用、异常的抛出、字段的访问等等。AOP框架通过拦截连接点来应用通知,从而实现对横切关注点的控制和管理。

3.3.4 切入点

定位连接点的方式,或者可以理解成被选中的连接点!

是一个表达式,比如execution(* com.spring.service.impl.*.*(..))。符合条件的每个方法都是一个具体的连接点。

3.3.5 切面

切入点和通知的结合,是一个类


3.4 Spring AOP框架介绍

1. AOP一种区别于OOP的编程思维,用来完善和解决OOP的非核心代码冗余和不方便统一维护问题!
2. 代理技术(动态代理|静态代理)是实现AOP思维编程的具体技术,但是自己使用动态代理实现代码比较繁琐!
3. Spring AOP框架,基于AOP编程思维,封装动态代理技术,简化动态代理技术实现的框架!SpringAOP内部帮助我们实现动态代理,我们只需写少量的配置,指定生效范围即可,即可完成面向切面思维编程的实现!


四 . Spring AOP框架注解方式实现

4.1 Spring AOP底层技术组成

  • 动态代理(InvocationHandler):JDK原生的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求代理对象和目标对象实现同样的接口(兄弟两个拜把子模式)。
  • cglib:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。
  • AspectJ:早期的AOP实现的框架,SpringAOP借用了AspectJ中的AOP注解。

4.2 执行流程

调用目标方法,底层会根据切入点和通知生成代理对象如果有接口就会生成JDK动态代理,反之则生成cglib动态代理

4.3 AOP注解 

常见的AOP注解包括:

  1. @Aspect:定义切面类,用于描述切入点和通知。

  2. @Pointcut:定义切入点,用于描述需要拦截的连接点。

  3. @Before:定义前置通知,表示在目标对象方法执行前执行的通知。

  4. @After:定义后置通知,表示在目标对象方法执行后执行的通知。

  5. @AfterReturning:定义返回通知,表示在目标对象方法执行后并且成功返回结果时执行的通知。

  6. @AfterThrowing:定义异常通知,表示在目标对象方法抛出异常时执行的通知。

  7. @Around:定义环绕通知,表示在目标对象方法执行前后都执行的通知。

 

4.4 入门案例

 

 

 

 

4.5 切入点表达式

 

4.6 AOP通知获取数据

在AOP中,通知可以获取连接点(即被拦截的方法或者类)的相关数据。通知可以通过参数来接收这些数据,常见的参数类型包括:

  1. JoinPoint:连接点对象,可以获取连接点的相关信息,如方法名称、参数等。可以通过JoinPoint的方法来获取这些信息,例如getSignature()获取方法签名,getArgs()获取方法参数等。

  2. ProceedingJoinPoint:继承自JoinPoint,用于环绕通知中,可以控制目标方法的执行。可以调用ProceedingJoinPoint的proceed()方法来执行目标方法,还可以通过getArgs()获取方法参数等。

常用的JoinPoint和ProceedingJoinPoint的方法包括:

  1. getSignature():获取连接点的方法签名对象,返回一个MethodSignature对象。可以通过MethodSignature对象获取方法的详细信息,如方法名称、返回类型、参数类型等。

  2. getArgs():获取连接点的方法参数,返回一个Object数组。可以通过数组索引获取具体的方法参数。

  3. getTarget():获取连接点的目标对象,即被拦截的对象。

  4. getThis():获取连接点的当前对象,即代理对象。

对于ProceedingJoinPoint,除了继承了JoinPoint的方法外,还有以下常用方法:

  1. proceed():执行目标方法。在环绕通知中,可以通过调用proceed()方法来控制目标方法的执行。

  2. proceed(Object[] args):执行目标方法,并传入指定的参数。在环绕通知中,可以通过传入参数来控制目标方法的执行。

4.7 切面优先级设置

在AOP中,切面的优先级可以通过设置切面的order属性来进行配置。order属性是一个整数值,数值越小的切面优先级越高。

可以使用@Order注解来设置切面的优先级。例如:

@Aspect
@Order(1)
public class FirstAspect {
    // 切面逻辑代码
}

@Aspect
@Order(2)
public class SecondAspect {
    // 切面逻辑代码
}

在上面的例子中,FirstAspect的优先级为1,SecondAspect的优先级为2。因此,FirstAspect的切面逻辑会先于SecondAspect执行。

实际意义:

实际开发时,如果有多个切面嵌套的情况,要慎重考虑。例如:如果事务切面优先级高,那么在缓存中命中数据的情况下,事务切面的操作都浪费了。

 此时应该将缓存切面的优先级提高,在事务操作之前先检查缓存中是否存在目标数据。


总结

这篇博客主要讲解了Spring AOP相关的内容,我们下一篇博客见

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

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

相关文章

面试算法52:展平二叉搜索树

题目 给定一棵二叉搜索树,请调整节点的指针使每个节点都没有左子节点。调整之后的树看起来像一个链表,但仍然是二叉搜索树。 分析 看起来需要按照节点的值递增的顺序遍历二叉搜索树中的每个节点,并将节点用指向右子节点的指针连接起来。这…

观测云产品更新 | 单点登录新增 OIDC / Oauth2.0 协议、数据转发优化、场景优化等

观测云更新 数据转发 1. 新增【观测云】选项,支持将数据保存到观测云的对象存储,计费逻辑按天出账,每天统计存储的压缩后的数据大小,按照每 GB 0.007 元出具对应账单。 2. 数据转发菜单导航位置调整至【管理】模块,…

ActiveMQ是什么?-九五小庞

MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点:1、支持多种语言…

黑色星期五来袭,Ozon为你提供丰富的推广工具和资源,助你实现销售突破!

Ozon的“黑色星期五”促销活动为卖家们提供了丰富的推广工具和资源,以确保他们的商品在促销期间获得最大的曝光度和销售额。卖家们应该充分利用这些机会,制定合适的折扣策略,并确保他们的商品在Ozon平台上脱颖而出。 为了推广Ozon黑色星期五促…

AI、万圣节与聊斋;用AI写甜蜜恋爱小暖文;AGI新趋势与机会洞察;Meta官方Llama 2入门指南 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 👀 时代杂志评选2023年度最佳发明,AI赛道入选名单 https://time.com/collection/best-inventions-2023 10 月 24 日&#xff…

java那些数据类型是安全加锁的。

我还没有反应过来,首先考虑的是基本数据类型,因为底层这块儿是在没有看过,Spring是被final修饰不可变的。后来才明白,原来是问你线程安全问题。 锁数据类型。 其实就是被synchronized修饰过的数据类型。 例如StringBuffer 底层 …

国外住宅IP代理测评选择的8个方法,稳定的海外IP哪个靠谱?

一、国外住宅IP代理是什么? 代理服务器充当您和互联网之间的网关。它是一个中间服务器,将最终用户与他们浏览的网站分开。如果您使用国外代理IP,互联网流量将通过国外代理服务器流向您请求的地址。然后,请求通过同一个代理服务器…

C++类和对象下(初始化列表,静态成员,explicit关键字,友元)

C类和对象下[初始化列表,静态成员,explicit关键字,友元] 一.初始化列表1.为什么会有初始化列表2.初始化列表的语法形式3.没有默认构造函数的自定义成员变量4.初始化列表是成员变量定义的地方5.初始化列表可以跟函数体内定义搭配使用6.初始化列表执行的顺序7.总结建议 二.静态成…

KT6368A蓝牙芯片发送指令设置中文蓝牙名是乱码 这个要如何处理

目录 一、KT6368A蓝牙芯片为什么发送at指令设置中文spp蓝牙名,是乱码 这个要如何处理 第一步,在pc端新建一个txt文档,将您需要的名字,汉字打出来,另存为UTF-8编码 第二步,使用winhex软件,当然…

JVS智能BI(自助式商业分析)本周更新内容已上线

在数据分析与可视化的世界中,我们始终在寻找新的创新与突破,以帮助用户更高效、更直观地理解数据,洞察业务的深层逻辑。本周更新包含了一系列的新功能、优化及bug修复,更新如下: 新增: 1.新增图表分类功能&#xff1…

宝宝洗衣机哪个牌子质量好?小型洗衣机质量排名

说起洗衣服,大部分的家庭都会备有一台洗衣机,不过如果有婴儿的话,贴心的宝妈宝爸也会特意将宝宝的衣服与大人的衣服分开来进行清洗。很多妈妈都会自己动手洗。由于婴儿的皮肤比较娇嫩、敏感,所以儿童的衣物与成人的衣物混合使用&a…

视频特效制作软件:After Effects 2024 mac中文版新增功能

After Effects 2024 mac是一款专业的视频特效和动态图形设计软件,它可以帮助用户创建各种令人惊叹的视觉效果,例如粒子系统、合成特效、绿屏抠像等。该软件支持动画制作,包括关键帧动画、形状动画、运动跟踪等工具,可以创建复杂的…

数据库实验报告(五)

1、实验目的 (1) 掌握对聚集函数的使用 (2) 掌握对分组的使用 (3) 掌握非关联子查询的用法,了解相关的连接谓词 2、实验预习与准备 (1) 了解Max&#x…

面试算法53:二叉搜索树的下一个节点

题目 给定一棵二叉搜索树和它的一个节点p,请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如,在图8.9的二叉搜索树中,节点8的下一个节点是节点9,节点11的下一个节点是null。 分析&#xf…

Web开发介绍详细介绍

Web开发介绍 1 什么是web开发 Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站。 所以Web开发说白了,就是开发网站的,例如下图所示的网站:淘宝,京东等等 那么我们…

常见接口测试面试题

1、按你的理解,软件接口是什么? 答: 就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。 2、HTTP和HTTPS协议区别? 答: https协议需要到CA(Certificate Authority,证书…

犀牛8 for Mac – 强大的三维建模软件,轻松实现创意设计

你是否正在寻找一款功能强大、易于使用的三维建模软件?犀牛8 for Mac是你的不二选择!作为最新版本的犀牛系列软件,它汇集了众多令人惊叹的特性,让你能够轻松实现自己的创意设计。 犀牛8 for Mac拥有丰富而强大的三维建模工具&…

【Python基础】变量基本使用

变量 1.变量定义02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3转义字符 3.变量输入输出3.1变量格式化输出 4.变量命名 1.变量定义 变量定义 • 在 Python 中,每个变量 在使用前都必须赋值 在使用前都必须赋值,变量 赋值以后 该变量…

R语言使用HTTP爬虫IP写一个程序

R语言爬虫是指使用R语言编写程序,自动从互联网上获取数据的过程。在R语言中,可以使用三个主要的包(XML、RCurl、rvest)来实现爬虫功能。了解HTML等网页语言对于编写爬虫程序也非常重要,因为这些语言是从网页中提取数据…

解决方案中排版的灵魂的---样式的设置

word样式是一系列字符格式和段落格式的集合,可以在编排重复格式的时候套用样式,减少重复化的操作。 一、word样式 二、样式基准 样式基准是最基本或原始的文字段落格式,文档中的其他样式以此为基础创建。 我新建样式,如果选择样…