SringAop

server/2025/3/1 17:15:30/

前言

入门

在这里插入图片描述
ioc就是对象交给spring管理

aop就是前面的统一功能,就是对一类问题的统一处理
aop就是面向切面编程

我们主要来学习自定义aop

比如我们来打印每个接口的时间
在这里插入图片描述
比如这个就可以计算出一个接口的时间
而我们的aop就是计算出所有的接口的时间

在这里插入图片描述
先引入依赖

在这里插入图片描述
在这里插入图片描述
接下来就是告诉这个切面在哪些地方生效
就是告诉作用域

需要用到Around注解

在这里插入图片描述
这样就对所有的controller都生效了

在这里插入图片描述
这样就知道是谁了

在这里插入图片描述
在这里插入图片描述
这样就实现了aop了

概念

在这里插入图片描述
@Around(“execution(* com.ck.springbook.controller….(…))”)
就是切点表达式

连接点就是具体作用的方法

具体要做的事情就是通知

切面就是前面三个加起来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
记得添加注解Aspect
当前有两个切面

多个切面的时候
在这里插入图片描述
先执行before,在执行after
目标方法在中间执行
在这里插入图片描述

在这里插入图片描述
这样我们就知道了执行顺序了

这个是没有发生异常的时候

在这里插入图片描述
我们发现了Around可以前处理,后处理,可以异常后处理,已经包含了前面的各个
我们如何把切点定义出来呢
避免改一个,而改动很多个

在这里插入图片描述
这样就可以了

在这里插入图片描述
发现还是可以正常运行的

在这里插入图片描述
其他类要调用别人的切点表达式,那么就要把路径写清楚了

在这里插入图片描述
但是如果pt为私有的话,就不能在其他类使用了,这个记录时间的就不能执行了

切面优先级

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在我们给它们修改顺序

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就成功改了顺序了

切点表达式

在这里插入图片描述

execution

在这里插入图片描述
第二个星是类名,第三个星是方法名

(…)是参数,这个表示0到n个参数
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
t1方法本身最好设置为public

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

annotation

我们先来模拟实现Aspect注解

在这里插入图片描述
TYPE表示这个注解只能加在类上

Retention表示注解的生命周期

在这里插入图片描述
大括号里面可以写多个

在这里插入图片描述
这样就可以使用了
在这里插入图片描述

现在只要我们加个我们新创建的注解,就要使用这个记录时间的切面

这下就要使用annotation注解了

在这里插入图片描述

这样写的意思就是,只要我们方法加了这个注解,就会执行这个切面

在这里插入图片描述

但是我们在u2方法上面加了这个自定注解,还是没有记录时间呢

在这里插入图片描述

那是因为没有交给spring管理

在这里插入图片描述
这样就可以了

在这里插入图片描述
记下这个的包名

在这里插入图片描述
这样写的意思就是只要写了requestMaping注解的,都会执行这个切面

使用的代理模式

在这里插入图片描述
在这里插入图片描述

静态代理

代码没有要求
下面这个是房东

在这里插入图片描述

在这里插入图片描述
现在实现代理,中介在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个就是静态代理
谁代理的,运行前,在class中就确定了

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是这里一改全改,挺麻烦的

JDK动态代理

就是代理对象在运行时才创建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个就是定义在目标方法前和后分别执行什么
就是说代理对象要做什么事情,除了完成目标方法以外(invoke)
还有前后要做什么
method就是目标方法
invoke就是去调用
target就是哪个目标方法

在这里插入图片描述
proxy就是代理对象

CGLIB动态代理

JDK代理只能代理接口,或者实现了接口的类
不能代理没有实现接口的类
比如controller
CGLIB既可以代理接口,也可以是类

在这里插入图片描述
先添加依赖

在这里插入图片描述
我们用哪个,后面就要接着用这个包,不要换了,不然就出错了
比如你用spring的,后面也要用spring的

在这里插入图片描述
这样就写好了CGLIB的代理了

在这里插入图片描述
在这里插入图片描述
这样就成功了

如果使用CGLIB的包的话,需要添加vm option

在这里插入图片描述
在这里插入图片描述
添加这个就可以了
在这里插入图片描述
aop就是基于动态代理实现的
具体是哪种代理,要看情况了

实现了接口的就是有implement,controller就是没有实现接口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看的出来没有实现接口的就是CGlib,而且在false下

测试这个类的时候记得加上我们自定义的aop注解,不然跟aop都没有关系了,切面的Around还要给到我们自定义的注解,还要加上注解,给spring管理的
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这样就可以了

这就表示了是jdk代理了
设置为true
结论都是CGLIb代理了

如果不配置,那么就都是CGlib,默认是true的
但是jdk默认是false的

我们的spring默认是true的

我们现在设置为fasle
在这里插入图片描述
把接口改为类,强转为类
就会报错
在这里插入图片描述
这个说明了jdk不能代理类

只有在false下才存在jdk代理
而且只有接口才有jdk,jdk不能代理类,强转为lei会出错
在这里插入图片描述
而CGLIb类和接口都可以代理

false下
在这里插入图片描述
spring2.0默认是true,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以前的springframework是默认false,springboot2.0开始默认是true

总结


http://www.ppmy.cn/server/171591.html

相关文章

CT技术变迁史——CT是如何诞生的?

第一代CT(平移-旋转) X线球管为固定阳极,发射X线为直线笔形束,一个探测器,采用直线和旋转扫描相结合,即直线扫描后,旋转1次,再行直线扫描,旋转180完成一层面扫描,扫描时间3~6分钟。矩阵象素256256或320320。仅用于颅脑检查。 第二代CT (平移-旋转) 与第一代无质…

Shell编程时常用的系统文件

1. Linux系统目录结构 /根目录,所有文件的第一级目录/home普通用户家目录/root超级用户家目录/usr用户命令、应用程序等目录/var应用数据、日志等目录/lib库文件和内核模块目录/etc系统和软件配置文件/bin可执行程序目录/boot内核加载所需的文件,grub引…

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…

Pytorch简单概述

目录 一、Pytorch 发展1.1 什么是LUA?大家往下看:起源与发展语言特点 1.2 起源与发展 二、其他深度学习框架2.1 TensorFlow2.2 Keras2.3 Caffe2.4 Theano2.5 CNTK(Microsoft Cognitive Toolkit)2.6 MXNet Pytorch的安装&#xff0…

实现遍历Windows所有字体的基本属性

参考podofo #include <windows.h> #include <string> #include <memory> #include <set> #include <unordered_map> #include <vector> #include <algorithm> #include <iostream> #include <iomanip> #include <fst…

综合练习 —— 递归、搜索与回溯算法

目录 一、1863. 找出所有子集的异或总和再求和 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路 问题分析 核心思想 实现细节 代码解析 初始化 DFS 函数 时间复杂度 空间复杂度 示例运行 输入 运行过程 总结 二、 47. 全排列 II - 力扣&a…

数据结构——二叉树经典习题讲解

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的二叉树 递归很重要的一些注意事项&#xff1a; 1&#xff1a;递归你能不能掌握在于&#xff1…

HTTPS 与 HTTP 的区别在哪?

HTTP与HTTPS作为互联网数据传输的核心协议&#xff0c;其通信机制与安全特性深刻影响着现代网络应用的可靠性与用户体验。本文将解析两者的通信流程、安全机制及核心差异。 一、HTTP的通信机制 先来看看HTTP是什么吧。 HTTP基于TCP/IP协议栈&#xff0c;采用经典客户端-服务…