AOP介绍

news2024/11/25 18:25:49

    • AOP的介绍
    • AOP相关概念
      • 相关概念:
      • 细谈通知
    • Spring AOP使用
      • 准备工作
      • 前置通知具体实现
      • 环绕通知
      • 配置规则表达式解析
    • Spring AOP原理

AOP的介绍

AOP:AOP是一种思想;面向切面编程。它对某一类的事情做集中处理;更准确的说是面向集中功能的编程
Spring AOP:AOP思想的一种实现

AOP作用:AOP 可以扩充多个对象的某个能⼒;像是对面向对象一种补充和完善。
登录功能判断
统⼀⽇志记录
统⼀⽅法执⾏时间统计
统⼀的返回格式设置
统⼀的异常处理
事务的开启和提交等

AOP相关概念

相关概念:

切面(类):代表一个AOP类型(处理的事件是什么);一个项目可能有多个AOP;对应不同功能的实现。比如:用户登录功能判断、日志的统计记录

切点(方法):定义拦截规则

通知(方法具体实现):切面在特定切入点处要执行的代码。执行AOP逻辑业务

连接点:可能触发这个切点(方法)的点叫连接点。比如:我们要进行删除文章;里面就涉及一个判断用户登录状态;这个删除文章按钮就是连接点

细谈通知

切面的目标是它要完成的工作;这个工作就是通知(描述了在哪些连接点上应用哪些通知)
在Spring切面类可以在方法加以下注解;设置其方法为通知方法;当满足条件后就进行方法的调用:
前置通知使⽤ @Before:通知⽅法会在⽬标⽅法调⽤之前执⾏。
后置通知使⽤ @After:通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。
返回之后通知使⽤ @AfterReturning:通知⽅法会在⽬标⽅法返回后调⽤。
抛异常后通知使⽤ @AfterThrowing:通知⽅法会在⽬标⽅法抛出异常后调⽤。
环绕通知使⽤ @Around:通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执⾏⾃定义的⾏为。

通知方法:
前置通知:在目标方法调用之前执行的通知
后置通知:在目标方法调用之后执行的通知
环绕通知:在目标方法调用前、后执行通知(特别适合方法执行时间的统计)
异常通知:在目标方法抛出异常执行的通知
返回通知:在目标方法返回时候执行的通知

Spring AOP使用

准备工作

1:正常创建Spring项目;添加Spring Web依赖;添加AOP依赖
在这里插入图片描述
这个应用商店也不是万能的;所以我们得去中央仓库寻找依赖
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

使用:在启动类同级或者子类下创建切面
在这里插入图片描述
AOP的实现有:Spring AOP;AspectJ;而spring aop出的比较晚;aspectj比较早诞生并被广泛使用;spring aop也变成兼容这个东西。语法是AspectJ的;具体实现是Spring AOP这个框架。Spring AOP也保留这个注解名字是AspectJ。

前置通知具体实现

1:创建切点(定义拦截规则)
在这里插入图片描述

拦截内容设置:
这里拦截是固定的写法;通过修改里面的内容实现不同的拦截(我是要拦飞机还是拦火车呢)

  • 就是不管什么返回值都去拦截。后面就是要拦截的包名+类名;先只拦截这里的。后面的 . *是拦截的方法。当你写的是.a那就是拦截a开头的方法。参数如果没要求就是括号里面两个点(…)。。如果只要拦截int参数;那你就写int。

2:切点通知实现
在这里插入图片描述

3:连接点实现
上面的操作还没有连接点(所有可能触发切点的点);它是不会触发前置方法的执行
在这里插入图片描述
通过以下效果发现确实拦截到;并且执行了前置方法(我们在配置规则里写的就是拦截Usercontorller的所有方法;如果你是在其它类就不会生效;具体看你是怎么配置规则的)
在这里插入图片描述
后置通知、异常通知、返回通知写法都是一样的;只是注解不同

环绕通知

环绕通知特殊一点;把事件的本身交给你;ProceedingJionPoint代表我要访问的方法本体;所以环绕通知可以完全控制方法调用流程的通知;你可以在中间做其它事情。比如:决定是否执行被通知的方法,以及如何处理异常和返回值。

在这里插入图片描述
在这里插入图片描述
上述的代码;我们通过一个调试的手段也能看到这个对象里面的情况;它确实去在中间调用我们的目标方法

在这里插入图片描述
我们在执行上述环绕通知;执行流程会受到前置方法和后置方法影响;所以我们得把前置方法给注释掉再进行测试。如果前置方法和后置方法都存在。执行顺序如下
在这里插入图片描述

配置规则表达式解析

在这里插入图片描述
AspectJ支持三种通配符:
""通配符:可以匹配任意个字符;只能匹配一个元素(包、类、方法、方法参数)
"…"通配符:可以匹配多个元素,表示类时必须和 * 联合使用
"+"通配符:表示按照类型匹配指定类的所有类;必须跟在类名后面;比如:com.cba.Stu+表示继承该类的所有子类包括本身。
execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>)
中间是拦截的种类;修饰符是可以省略的。类后面可以加+;表示拦截它和它子类;方法可以用
表示拦截所有方法;拦截所有参数可以用…
修饰符:一般省略;标识度不高;我们写修饰符通常都是public。* 表示任意标识符都可以
返回类型:不能省略;写void拦截返回没有值的;*代表任意
包:
在这里插入图片描述
类:

  • 任意 、*test 则是以test结尾、Test *则是以Test开头、UserTest 固定类

方法名:
不能省略 * 任意、addUser 固定方法、add * 以add开头、*add 以add结尾

参数:
() 指定无参、(int)指定int 、(int,int)指定两个int、(…)任意参数
throws:
可省略,一般不写

Spring AOP原理

Spring AOP基于动态代理模式实现,主要分为JDK动态代理实现和CGLIB字节码生成实现两种方式。
使用代理就能帮你招待客人;遇到非法就拦截在外。如果我直接在目标对象处理;那我的添加登录效验的代码还得加入到逻辑里面;我通过代理就可以把登录没效验的筛选掉
在这里插入图片描述
动态代理:动态代理(根据程序特征在运行生成代码)spring AOP会根据不同场景选择动态代理的实现功能;
静态代理:手动编码实现代理类并在程序运行前进行编译的代理方式,代理类和目标类都是在编译期确定;提起写好的。

织入:代理生成时机
1:编译期;切⾯在⽬标类编译时被织⼊。这种⽅式需要特殊的编译器。AspectJ以这种方式织入
2:类加载期;切⾯在⽬标类加载到JVM时被织⼊。这种⽅式需要特殊的类加载器
,它可以在⽬标类被引⼊应⽤之前增强该⽬标类的字节码。
3:运行期;切⾯在应⽤运⾏的某⼀时刻被织⼊。⼀般情况下,在织⼊切⾯时,AOP容器会为⽬
标对象动态创建⼀个代理对象。SpringAOP以这种⽅式织⼊切⾯的。

动态代理实现方式:
JDK动态代理:通过反射实现;速度快;被代理的类一定要实现接口
CGLIB动态代理:通过字节码增强技术(生成动态子类;子类去调用父类方法;你看不到的);动态生成代理对象。(通过代理类的子类来实现的动态代理;不能被final修饰)

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

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

相关文章

【Linux常用命令上】——Linux系统02

目录索引 快速复习导航&#xff1a;查看Linux的ip&#xff1a;查看当前用户&#xff1a;切换路径&#xff1a;退出当前文件夹&#xff1a;用户工作目录&#xff1a; 文件树&#xff1a;测试网路是否正常连接&#xff1a;清除指令&#xff1a;查看当前操作系统信息&#xff1a;s…

SpringBoot整合模板引擎Thymeleaf(3)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 在本章节详细介绍Thymeleaf的内置对象及其工具类。 Thymeleaf内置对象 对象描述#ctx上下文对象#vars同 #ctx&#xff0c;表示上下文变量#locale上下文本地化&#…

Java集合中ArrayList、LinkedList异同(面试题)

为什么一般都使用 List list new ArrayList() ,而不用 ArrayList alist new ArrayList()呢&#xff1f; 1. 问题就在于List有多个实现类&#xff0c;如 LinkedList或者Vector等等&#xff0c; 现在你用的是ArrayList&#xff0c;也许哪一天你需要换成其它的实现类呢&#xf…

自定义异常

打开搜索界面&#xff0c;快捷键:双击shift键盘 如何创立一个自己定义简单的异常&#xff0c;如下: 1&#xff0c;先用extends继承Exception&#xff08;总异常类&#xff09;然后定义私有类变量 2&#xff0c;用快捷键&#xff1b;latinsert 选择构造器&#xff08;Constru…

Python+Requests+Unittest接口自动化测试

(1)接口自动化测试的意义、前后端分离思想 接口自动化测试的优缺点&#xff1a; 优点&#xff1a; 测试复用性。 维护成本相对UI自动化低一些。 为什么UI自动化维护成本更高&#xff1f; 因为前端页面变化太快&#xff0c;而且UI自动化比较耗时&#xff08;比如等待页面元素的…

C高级 day37

1、编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HOME的值…

ESP32 S3-OLED显示小数函数

ESP32 S3 ardino平台&#xff0c;配中景园7针0.96OLED屏显示小数 OLED网上的驱动代码一般厂商发货会提供驱动程序&#xff0c;但是显示小数很多都没有编写。这里编写了一段可显示任意位小数的代码&#xff08;以正点原子代码为基础&#xff09;&#xff0c;需要显示有符号的小数…

HDFS读写流程

读数据流程 客户端向NameNode请求文件的位置&#xff1a;客户端想要访问一个文件时&#xff0c;会向NameNode发送一个请求&#xff0c;要求获取该文件在HDFS上的位置信息。 NameNode将位置信息返回给客户端&#xff1a;NameNode接收到客户端的请求后&#xff0c;会返回该文件所…

【人脸检测0】视频分解图片与图片合成视频

一,引言 目标:这小节主要通过两个demo熟悉视频分解图片与图片合成视频的OpenCV的应用 环境:python3.6+OpenCV3.3.1 二,示例 Demo1:视频分解图片 目标: 1.指定文件夹中读取视频文件 2.将视频文件分解为图片 3.将图片保存在指定文件夹中 # -*-coding:utf-8-*- #auth…

Eureka配置文件详解

Eureka配置文件详解 文章目录 Eureka配置文件详解一、Eureka instance 配置项&#xff1a;二、Eureka Client 配置项三、Eureka Dashboard仪表板配置项四、Eureka Server配置项4.1 server与client关联配置4.2 server 自定义实现的配置4.3 server 与 remote 关联的配置4.4 serve…

《计算机图形学基础教程(孔令德)》期末考试-复习重点

文章目录 第一章&#xff08;重点&#xff09;&#xff1a;考概念1. 计算机图形的两种表示方法 P52. 计算机图形学、模式识别、计算机视觉等等之间的关系 P63. 计算机图形学的研究内容 &#xff08; 笔记P7 &#xff09;4. 发展历史 P75. 图形显示设备的发展 P96. 相关名词解释…

导入动画

资料 Rig Animation Unity性能优化 参数设置建议 Animation Type 不存在动画选择None;非人形动画选择Generic;人形动画可选择Generic或Humanoid。 需要反向动力学或动画重定向使用Humanoid&#xff0c;其他情况可使用Generic 骨骼数目相差不大时&#xff0c;Generci比Humano…

GWAS:表型的标准化(the normalization of phenotype)

GWAS表型的标准化方法一般有Quantile normalization、Inverse rank normalization、Z-score normalization等。 各自区别如下&#xff1a; 一、Quantile normalization 该方法将每个样本中表型值进行排序&#xff0c;然后将其规范化到一个标准分布&#xff0c;通常是正态分布…

uniapp多级联动选择器,区域选择组件分享

uniapp官方的多级联动选择器效果怎么样就不多说了&#xff0c;一言难尽。。。。 然后我对比了多个组件库&#xff0c;发现了uview组件库&#xff0c;里面有个picker选择器还可以&#xff0c;这是链接 但是在使用过程中也发现了该组件的一些问题 1、操作栏只能显示在顶部&…

MAC搭建M1环境的stable-diffusion

MAC M1 搭建 stable-diffusion 环境 文章目录 MAC M1 搭建 stable-diffusion 环境环境准备1. 硬件环境2. 系统环境3. 基础软件环境 主要参考资料操作步骤1. 下载git2. 下载conda3. 创建python环境4. 下载仓库5. 安装依赖6. 转换模型7. 验证和测试8. 构造Web界面9. 测试WebUI10.…

2023软件测试面试热点问题,3天刷完你的软件测试就牛了~

与开发工程师相比&#xff0c;软件测试工程师前期可能不会太深&#xff0c;但涉及面还是很广的。 在一年左右的实习生或岗位的早期面试中&#xff0c;主要是问一些基本的问题。 涉及到的知识主要包括MySQL数据库的使用、Linux操作系统的使用、软件测试框架问题、测试环境搭建问…

2022电工杯数学建模B题解题思路(5G 网络环境下应急物资配送问题)

一、前言 本文是对2022年第十四届 “电工杯” 高校数学建模挑战赛B题&#xff1a;5G 网络环境下应急物资配送问题的解题思路&#xff0c;希望能够对正在学习数学建模或者研究该类问题的读者提供帮助。作者在当届的比赛中&#xff0c;获得了本科组三等奖的成绩&#xff…

【新星计划·2023】Linux是什么?它与Windows有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、Linux是什么&#xff1f; 二、Linux的应用领域 1、服务器领域 2、嵌入式领域 3、虚拟化 三、Linux的未来 1、云计算 2、大数…

Nmap中NSE数据文件分析

Nmap中NSE数据文件分析 1.Nmap中数据文件所在的位置2.暴力穷举时所使用的用户名和密码列表数据文件3.Web应用审计数据文件http-fingerprints.luahttp-sql-errors.lsthttp-web-files-extensions.lsthttp-devframework-fingerprints.luahttp-folders.txtvhosts-default.lstwp-plu…