Spring:AOP 的详细内容

news2024/11/17 4:43:33

文章目录

  • Spring:Day 03
  • AOP
  • 一、概述
  • 二、搭建环境
  • 三、实现 AOP
    • 1. 方式一:使用原生 Spring 的 API 接口
    • 2. 方式二:自定义类(切面)
    • 3. 方式三:注解
  • 四、总结

Spring:Day 03

AOP

一、概述

AOP:Aspect Oriented Programming,面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

本质:动态代理

AOP 实现的目的:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。而应用对象只实现它们应该做的,例如完成业务逻辑,它们并不负责其它的系统级关注点,例如日志或事务支持。

功能和作用:利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

名词解释

  • 切面(Aspect):一个关注点的模块化,可以是自定义的一个类(用来存放对被代理对象进行的额外操作),用注解 @Aspect 在自定义类上方声明,表示该类为一个切面;
  • 连接点(Joinpoint):在程序执行过程中某个特定的点,一个切面中的所有方法都是连接点;
  • 切点(Pointcut):从连接点中筛选出一些作为切点,切点指定了执行的地点
  • 通知(Advice):通知增强,需要在切点处完成的工作叫做通知,例如日志记录,性能统计,安全控制,事务处理,异常处理等;
  • 织入(Weavy):将切面应用到被代理对象,并使得代理对象被创建的过程称为织入

二、搭建环境

  • 使用 AOP 织入,需要导入一个依赖
<!-- aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>
  • 准备一个接口(用来定义要执行的业务)和实现类(被代理对象)

  • 接下来,将使用三种不同的方式来实现 AOP,即实现动态代理
    • 方式一:使用原生 Spring 的 API 接口;
    • 方式二:自定义类(切面);
    • 方式三:注解。

三、实现 AOP

1. 方式一:使用原生 Spring 的 API 接口

方法

  1. 编写前置类实现 MethodBeforeAdvice 接口;后置类实现 AfterReturningAdvice 接口;
  2. 重写方法method 表示执行的方法;args 表示方法的参数;target 表示被代理对象;returnValue 表示返回值;
  3. 编写配置文件 applicationContext.xml,注册 bean,导入 aop 约束,配置 aop(包括设置切入点和执行环绕增加);
  4. 测试。
  • 编写前置类和后置类

  • 配置文件

  • 测试

注意点

  1. 在配置文件中导入 aop 约束时,可以:<aop:config> + 回车 自动导入;

  2. 可以设置多个切入点,其中 execution 表达式指定了要切入的位置,表达式的语法为:execution(修饰符 返回值类型 包.类.方法名(参数) throws异常)

    • 修饰符:一般省略
    • 返回值类型:不能省略,可以为 void、String 或者任意类型
    • 包.类.方法名:类和方法名可以用 * 表示所有方法名不能省略,因此小括号前的就是方法名
    • 参数:可以为无参 ()、指定类型 (int, String)、任意参数代替 (…)
    • throws 异常:一般省略

    如:execution(* com.Sun3285.service.UserServiceImpl.*(..)) 表示返回值为任意类型、UserServiceImpl 类的任意方法、任意参数。

  3. 动态代理代理的是接口,因此测试时,返回值类型一定是接口的类型;

  4. 通过 aop 配置,前置类中的方法会在调用业务方法之前执行,后置类中的方法会在调用业务方法之后执行,和动态代理的执行流程一样

  5. 这样就实现了被代理对象执行业务与代理做额外的操作相互分离,最后由 Spring 来执行一个 aop 切入就可以实现代理过程。

2. 方式二:自定义类(切面)

方法

  1. 编写一个自定义的类,里面定义一些方法,这些方法是代理需要做的额外操作;
  2. 编写配置文件 applicationContext.xml,注册 bean,导入 aop 约束,配置 aop;
  3. 测试。
  • 自定义的类,存放一些代理需要做的额外操作

  • 配置文件

  • 测试

3. 方式三:注解

方式三使用注解是对方式二的简化:将配置 aop 的步骤用注解代替了之前的 xml 配置。

使用到的注解有:

注解说明
@Aspect标注在上,标注这个类是一个切面
@Before(“execution(切入点位置)”)标注在方法上,在切入点之前执行该方法
@After(“execution(切入点位置)”)标注在方法上,在切入点之后执行该方法

注意

  • @Aspect:相当于配置文件中的 <aop:aspect ref="要引用类的 bean id">
  • @Before:相当于配置文件中的 <aop:before method="方法" pointcut-ref="切入点"/>
  • @After:相当于配置文件中的 <aop:after method="方法" pointcut-ref="切入点"/>

使用注解实现 AOP 的方法

  1. 【与方式二相同】编写一个自定义的类,里面定义一些方法,这些方法是代理需要做的额外操作;
  2. 【与方式二相同】编写配置文件 applicationContext.xml,注册 bean,导入 aop 约束;
  3. 在配置文件中开启注解支持<aop:aspectj-autoproxy/>
  4. 使用注解配置 aop;
  5. 测试。
  • 配置文件

  • 注解配置 aop

  • 测试

注意:导入注解的包为 org.aspectj.lang.annotation 下的包。


四、总结

  1. 总的来说,AOP 就是在不影响原来业务类的情况下,对业务进行动态地增强

  2. 实现 AOP 的方式有三种:

    • 方式一可以通过反射得到被代理对象的一些信息,本质是动态代理,功能更强大;
    • 方式二不能获取被代理对象的信息,可以只做一些与被代理对象无关的额外的操作;
    • 方式三:使用注解是对方式二的简化,配置 AOP 时用注解代替了之前的 xml 配置。
  3. 三种实现方式配置 AOP 时:

    • 方式一:配置文件中,使用 aop:pointcut 设置切入点,然后 aop:advisor 设置环绕增加;
    • 方式二:配置文件中,先使用 aop:aspect 自定义切面,然后使用 aop:pointcut 设置切入点,使用 aop:beforeaop:after 决定方法的执行前后;
    • 方式三:使用注解配置。
  4. 在方式一中,代理的额外操作是否在业务方法前后,是由实现的原生 Spring 的 API 接口决定的;

  5. 所有的类都需要注册为 bean

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

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

相关文章

相见恨晚的5款良心软件,每款都是经过时间检验的精品

今天来给大家推荐5款良心软件,每款都是经过时间检验的精品,用起来让你的工作效率提升飞快&#xff0c;各个都让你觉得相见恨晚&#xff01; 1.颜色选择器——ColorPicker ColorPicker是一款用于在屏幕上选择颜色的工具。它可以让你快速地获取任意像素的颜色值,并复制到剪贴板…

信息收集-子域名

&#xff08;一&#xff09;、子域名 子域名是父域名的下一级&#xff0c;比如“huiyuan.xxx.com”和“bbs.xxx.com”这两个域名是“xxx.com”的子域名&#xff0c; 企业可能有多个、几十个甚至更多的子域名应用&#xff0c;因为子域名数量多&#xff0c;企业子域名应用的防护…

设计模式之【迭代器模式】,对集合访问的统一

文章目录 一、什么是迭代器模式1、迭代器模式使用场景2、迭代器模式的优势3、迭代器模式的四种角色4、迭代器模式的优缺点 二、手写一个迭代器1、迭代器模式的一般写法2、课程迭代器 三、源码中的迭代器1、ArrayList 一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pat…

(5.12-5.18)【大数据新闻速递】

关 注gzh“大数据食铁兽”&#xff0c;了解更多大数据快讯 【打造全国首个数据要素产业集聚区&#xff01;浦东数据要素产业规模2025年将达1000亿元】 5月16日&#xff0c;“数启浦东”2023浦东新区数据要素产业主题系列活动启动。记者获悉&#xff0c;《张江数据要素产业集聚…

【实用工具】Guava EventBus(事件总线)快速入门

介绍 EventBus是Guava的事件处理机制&#xff0c;是设计模式中的观察者模式&#xff08;生产/消费者编程模型&#xff09;的优雅实现。对于事件监听和发布订阅模式&#xff0c;EventBus是一个非常优雅和简单解决方案&#xff0c;我们不用创建复杂的类和接口层次结构。 Java案…

树莓派报错Oops - unable to determine board type . . .model:17

报错原因 改变方法 cd /tmp wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb成功

技术的力量:如何用数据驱动实现设备健康管理

在当今数字化时代&#xff0c;设备管理部门面临着日益复杂的挑战。传统的设备管理方法已经无法满足快速发展的需求&#xff0c;而数字化转型成为了提升效率、降低成本、增强竞争力的关键路径。 本文将介绍设备管理部门数字化转型的痛点、可参考的蓝图规划以及PreMaint平台在实现…

浅谈面向无线通信的微波毫米波无源天线及器件

一、背景 本文谈及的微波毫米波&#xff08;下简称微波&#xff09;产品主要是指工作在4&#xff5e;86GHz频段的无源天线和器件。它们使通信系统在不需要电源模块的情况下具备较高的动态范围和实现宽带模拟信道传输&#xff0c;属于现代点对点无线通信系统中核心天馈部件。文…

5年测试开发,跳槽薪资25k变成30k,总结的这些面试题,你会哪些?

每年的金三银四都是各大公司招聘程序员的最佳时期&#xff0c;在这段时间内有好多程序员会为了面试而发愁&#xff0c;不知道如何才能收到好的offer&#xff0c;拿到理想的薪资&#xff0c;实现自我的人生价值&#xff01; 我想告诉大家的是&#xff0c;其实都不用愁的&#xf…

AOSP构建、编译基础理解

AOSP构建、编译基础理解 构建系统 参考这篇文章&#xff0c;写的比较好&#xff0c;我就不狗尾续貂了&#xff01; android build system编译系统概述 source build/envsetup.sh之后的事情 source也就是执行build/envsetup.sh里面的脚本&#xff0c;改脚本定义许多命令&…

​GPT充当大脑,指挥多个模型协作完成各类任务,通用系统AutoML-GPT来了

使用 ChatGPT 实现通用人工智能&#xff0c;思路打开了。 当前&#xff0c;AI 模型虽然已经涉及非常广泛的应用领域&#xff0c;但大部分 AI 模型是为特定任务而设计的&#xff0c;它们往往需要大量的人力来完成正确的模型架构、优化算法和超参数。ChatGPT、GPT-4 爆火之后&…

ST典型碳化硅MOSFET驱动应用方案

ST典型碳化硅MOSFET驱动应用方案 1.栅极驱动器规格和功能实现 参考资料&#xff1a;ST官网应用手册《AN4671》 作者&#xff1a;Xiou 1.栅极驱动器规格和功能实现 以下是对栅极驱动要求的简短列表&#xff1a; dv / dt 的瞬变抗扰度&#xff1a;在整个温度范围内 50 V/ns。 …

超级简单的开源saas后台系统管理框架Vite+Vue3

大家好&#xff0c;今天我给大家带来一款超简saas后台管理系统框架&#xff0c;他是一款快速开发SAAS通用管理系统后台框架&#xff0c;前端采用最新的技术栈ViteTypeScriptVue3ElementPlus最流行技术架构&#xff0c;后台结合PHP8、Java SDK、Python等主流后端语言搭建&#x…

黑盒测试方法: 从原理到实战

文章目录 一. 如何设计测试用例二. 常用黑盒测试方法1. 基于需求设计的测试用例2. 等价类划分法3. 边界值4. 判定表分析法 (因果分析法)5. 正交排列6. 场景设计法7. 用例场景示例8. 错误猜测法 三. 补充案例Fiddler实现弱网测试水杯测试用例微信朋友圈测试用例淘宝购物车测试用…

ESP8266连接 TLink 云平台

1.硬件准备 &#xff08;1&#xff09;正点原子 ATK-ESP-01 WIFI 模块 &#xff08;2&#xff09;正点原子 STM32F103ZET6精英板子 &#xff08;3&#xff09;USB转TTL模块 2.烧录固件 &#xff08;1&#xff09;烧录软件和固件都可以在正点原子增值资料包找到。 &#xff08;2…

网络安全基础--dns劫持及IP信息收集

0x01 验证是否存在CDN 方法1&#xff1a; 很简单&#xff0c;使用各种多地 ping 的服务&#xff0c;查看对应 IP 地址是否唯一&#xff0c;如果不唯一多半是使用了CDN&#xff0c; 多地 Ping 网站有&#xff1a;多个地点Ping服务器,网站测速 - 站长工具网站测速工具_超级ping…

创建python虚拟环境的两种方法

创建python虚拟环境的两种方法 一、anaconda环境下1、检查是否安装了anaconda2、创建虚拟环境3、激活虚拟环境4、其他命令 二、python纯净环境下1. 安装virtualenv2. 创建虚拟环境3. 激活虚拟环境 一、anaconda环境下 1、检查是否安装了anaconda 只有在anaconda环境下才能创建…

近百个最新免费chatgpt访问集合,包含国内直接访问和国外升级版本

近百个最新免费chatgpt访问集合&#xff0c;包含国内直接访问和国外升级版本。 ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的…

慎投,5月有4本SCIE期刊被剔除(附SCI/SSCI目录下载)

2023年5月SCI、SSCI期刊目录更新 2023年5月18日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次4月WOS期刊目录剔除8本SCIE&SSCI期刊之后&#xff0c;此次5月更新又有4本SCIE期刊发生变动&#xff0c;其中有1本期刊被踢出SCIE数据库&#xff0c;3本期刊更改了名…

pdf怎么转换成ppt文件,5种方法任你选

pdf怎么转换成ppt文件&#xff1f;想必这是我们办公过程中非常常见的问题吧。众所周知&#xff0c;PDF文件格式通常用于存储文档&#xff0c;其内容可能是图像、文字或表格&#xff0c;展示在一个页面上。PPT文件格式通常用于创建演示文稿&#xff0c;其中每个页面都是幻灯片&a…