第二部分:AOP
一、AOP简介
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。
AOP是OOP(面向对象编程)的进阶版。
作用:在不改变原始设计的基础上为其进行功能增强。
spring理念:无侵入式。


二、AOP入门实例
1、pom.xml导入坐标:注解开发(spring-context)、切面编程(aspectjweaver)
2、配置类SpringConfig 内添加注解@EnableAspectJAutoProxy (开启spring对AOP注解驱动支持)表示要注解开发AOP
3、通知类MyAdvice:定义通知(功能)、定义切入点(位置)、定义切面(绑定通知和切入点)
@Component //定义通知类受spring容器管理(让spring加载此通知类)
@Aspect //定义当前类为切面类(让spring明白此类 是做AOP的)//在此类定义通知(共性功能)
public class MyAdvice {//定义切入点(本质上就是确定要加功能的方法的准确位置)(// 依托一个不具有实际意义的方法进行,即无参无返回值,方法体无实际逻辑)@Pointcut("execution(void com.itheima.dao.BookDao.update())")private void pt(){}//将切入点(位置)和通知(功能)绑定@Before("pt()")//定义通知(本质就是要添加的功能)public void method(){System.out.println(System.currentTimeMillis());}
}
三、AOP工作流程
springAOP本质:代理模式
如果切入点能和我要造bean的那个类匹配上对应的方法,则造代理对象;否则造原始对象
打印对象的getClass()方法(如bookDao.getClass())就可以看见是代理对象还是原始对象


四、AOP切入点表达式
切入点定位到接口 & 实现类均可(但是写到实现类就紧耦合了,所以不写)
@Pointcut("execution(void com.itheima.BookDao.updata())")
@Pointcut("execution(void com.itheima.dao.impl.BookDaoImpl.updata())")
1、语法格式:

2、通配符
3、书写技巧

五、AOP通知类型<5>
<AOP通知描述了要添加的共性功能,共性功能要添加到切入点的合适位置。> AOP通知共分为5种类型:
前置通知、后置通知、环绕通知(重点)、返回后通知(了解)、抛出异常后通知(了解)
注意:环绕通知对原始方法调用以后,原始方法的返回值可以接出来,最终还要手动给送回去。下文中环绕通知即为规范格式。
@Component //定义通知类受spring容器管理(让spring加载此通知类)
@Aspect //定义当前类为切面类(让spring明白此类 是做AOP的)//在此类定义通知(共性功能)
public class MyAdvice {//定义切入点(本质上就是确定要加功能的方法的准确位置)(// 依托一个不具有实际意义的方法进行,即无参无返回值,方法体无实际逻辑)@Pointcut("execution(void com.itheima.dao.BookDao.update())")public void pt1(){}@Pointcut("execution(int com.itheima.dao.BookDao.select())")public void pt2(){}//将切入点(位置)和通知(功能)绑定@Before("pt1()")//前置通知public void before(){System.out.println("此处是增强添加的通知,并且是一个前置通知");}@After("pt1()")//后置通知public void after(){System.out.println("此处是增强添加的通知,并且是一个后置通知");}@Around("pt1()")//环绕通知public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("此处是增强添加的通知,并且是一个环绕通知");Object ret = pjp.proceed();System.out.println("此处是增强添加的通知,并且是一个环绕通知");return ret;}剩下俩个为:
@AfterReturning("")
@AfterThrowing("")

此处可以利用around对原始方法进行《隔离》!

六、万次执行效率测试
测试业务层:
切入点表达式要确定业务层
@Pointcut("execution(* com.itheima.dao.*.*())")public void pt1(){}
采用环绕通知获取执行万次的前后系统时间
@Around("pt1()")public void method(ProceedingJoinPoint pjp) throws Throwable {//获取执行签名信息Signature signature = pjp.getSignature();//通过签名获取接口名String className = signature.getDeclaringTypeName();//通过签名获取方法名String methodName = signature.getName();long start = (int) System.currentTimeMillis();for(int i = 0; i < 10000;i++){pjp.proceed();//此处代表执行业务层一万次}long end = (int) System.currentTimeMillis();System.out.println("执行一万次" + className + "." + methodName +"--->" + (end - start) + "ms");}
七、AOP通知获取数据
AOP是对原始方法进行增强的,必然要知道原始方法的数据。
基本操作:在通知的方法的参数内加上接口,调用接口的方法来获取原始方法的参数。
获取的数据有三类:原始操作的参数、原始操作的返回值、原始操作的异常。
每种类型的数据只有五类通知的部分可以获取:

1、获取参数
获取的参数类型为数组;对于前置通知获取参数后,可以对数据检验错误、修改等操作。
//将切入点(位置)和通知(功能)绑定//@Before("pt1()")//前置通知public void before(JoinPoint jp){System.out.println("此处是增强添加的通知,并且是一个前置通知");Object[] args = jp.getArgs();//此方法getargs获取参数是数组类型System.out.println(Arrays.toString(args));}
后置、环绕、、都一样。
2、获取返回值
@Around("pt1()")//环绕通知
public Object around(ProceedingJoinPoint pjp) throws Throwable {Object args[] = pjp.getArgs();return ret;
3、获取异常信息
@AfterThrowing(value = "pt1",throwing = "t")public void afterThrowing(Throwable t){System.out.println("返回异常" + t);}//注意通知的方法的参数要和标签的参数一致

八、百度网盘粘贴:字符串匹配自动处理多余的空格
AOP增强
@Component
@Aspect
public class DataAdvice {//定义切入点@Pointcut("execution(boolean com.itheima.service.ResourcesService.openURL(..))")public void pt(){}@Around("pt()")public Object trimStr(ProceedingJoinPoint pjp) throws Throwable{//提前获取参数 将参数修改后在传参给原始方法内Object args[] = pjp.getArgs();for (int i = 0; i < args.length; i++) {if(args[i].getClass().equals(String.class)){//判断是不是字符串类型args[i] = args[i].toString().trim(); //是字符串类型就trim}}Object ret = pjp.proceed(args);//将空格处理后的参数在传参给要执行的原始方法return ret;}
}
十一、AOP总结
回忆。
要会啥呢?
1、得知道pom.xml文件里面要配置spring-context依赖(spring注解开发)、aspectjweaver依赖(AOP注解和切入点表达式,AOP核心功能已经被加载到spring-context依赖了)
2、知道要在spring核心配置类中加载AOP
3、得知道在AOP配置类中加载扫描啥的 切入点表达式会写。@Pointcut(“”execution())
4、环绕通知@Around(“”)参数ProceedingJoinpoint pjp
要写固定的执行原始方法得到返回值Object ret = pjp.proceed(args); return ret;
以上这些都是固定的。
5、根据不同的需要,通知类里面的方法咋写就看自己的了。
相关文章:
第二部分:AOP
一、AOP简介 AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。 AOP是OOP(面向对象编程)的进阶版。 作用:在不改变原始设计的基础上为其进行功能增强。 spring理念&#x…...
分享一组天气组件
先看效果: CSS部分代码(查看更多): <style>:root {--bg-color: #E9F5FA;--day-text-color: #4DB0D3;/* 多云 */--cloudy-background: #4DB0D3;--cloudy-temperature: #E6DF95;--cloudy-content: #D3EBF4;/* 晴 */--sunny-b…...
微服务中RestTemplate访问其他服务返回值转换问题
背景: 接收一个springcloud项目,UI模块访问其他服务的接口,返回数据统一都是使用fastjson进行转换,但是新开发了几个新模块之后发现fastjson很多bug(各种内存溢出),但是很多地方已经重度依赖fa…...
Centos7.9上(离线)安装Gitlab
1、下载Gitlab的rpm安装包Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm,如果依赖缺失,yum安装即可 3、vi /etc/gitlab/gitlab.rb 配置external_url&…...
pikachu中RCE出现乱码的解决的方案
exec “ping” 输入127.0.0.1 这种乱码的解决办法就是在pikachu/vul/rce/rce_ping.php目录里面的第18行代码 header("Content-type:text/html; charsetgbk");的注释打开即可。 BUT但是吧!又出现了其他的乱码!但是搞完这个再把它给注释掉就行了…...
airflow是什么
Airflow 简介 Airflow是一个基于有向无环图(DAG)的可编程、调度和监控的工作流平台,它可以定义一组有依赖的任务,按照依赖依次执行。airflow提供了丰富的命令行工具用于系统管控,而其web管理界面同样也可以方便的管控调度任务,并…...
训练用于序列分类任务的 RoBERTa 模型的适配器
介绍 NLP当前的趋势包括下载和微调具有数百万甚至数十亿参数的预训练模型。然而,存储和共享如此大的训练模型非常耗时、缓慢且昂贵。这些限制阻碍了 RoBERTa 模型开发更多用途和适应性更强的 NLP 技术,该模型可以从多个任务中学习并针对多个任务进行学习;在本文中,我们将重…...
Linux之awk判断和循环
echo zhaoy 70 72 74 76 74 72 >> score.txt echo wangl 70 81 84 82 90 88 >> score.txt echo qiane 60 62 64 66 65 62 >> score.txt echo sunw 80 83 84 85 84 85 >> score.txt echo lixi 96 80 90 95 89 87 >> score.txt把下边的内容写入到s…...
Django入门
Day1 django环境安装 创建虚拟环境 # step1 创建虚拟环境 python3 -m venv datawhale_django # step2 mac进入虚拟环境 source ./datawhale_django/bin/activate # step3 退出虚拟环境 deactivate安装包 pip3 install django pip3 install djangorestframework pip3 …...
uniapp 格式化时间刚刚,几分钟前,几小时前,几天前…
效果如图: 根目录下新建utils文件夹,文件夹下新增js文件,文件内容: export const filters {dateTimeSub(data) {if (data undefined) {return;}// 传进来的data必须是日期格式,不能是时间戳//将字符串转换成时间格式…...
JProfiler —CPU评测
当JProfiler测量方法调用的执行时间及其调用堆栈时,我们称之为“CPU评测”。这些数据以多种方式呈现。根据你试图解决的问题,其中一个或另一个演示将是最有帮助的。默认情况下不会记录CPU数据,您必须打开CPU记录才能捕获有趣的用例。 一、调…...
994. 腐烂的橘子
994. 腐烂的橘子(面试题打卡/前缀和/简单) 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/rotting-oranges/ 题干: 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:…...
Rx.NET in Action 第三章学习笔记
3 C#函数式编程思想 本章内容包括 将 C# 与函数式技术相结合使用委托和 lambda 表达式使用 LINQ 查询集合 面向对象编程为程序开发提供了巨大的生产力。它将复杂的系统分解为类,使项目更易于管理,而对象则是一个个孤岛,你可以集中精力分别处理…...
Windows11环境下VS2019调用Pytorch语义分割模型(C++版)
语义分割模型在训练时往往采用python脚本进行网络搭建和训练,并获得训练好的模型。为了提高效率方便整个工程项目部署,实际工程应用中通常希望使用C编程语言调用训练好的网络模型。查询大量网络资料并踩过无数坑后,经实际测试实现了在window1…...
Milkv Duo 以太网使用与配置
网络配置 使能网卡 使用ip link查看是否存在eth0网卡,若无使用如下命令使能网卡: ip link set eth0 up两次使用ip link确认网卡eth0已经使能。 配置IP、gws 本人设备连接到华为路由器下,故增加如下路由信息: ip route add d…...
bash: make: command not found
make之后报错信息如下:cd 对应的文件路径后 make 发现报错:bash: make: command not found 这个原因可能是没有安装make工具,也可能是安装了make之后,没有将make的文件路径添加到系统环境变量中 有没有安装make,可以使用Search Everything搜索是否有make…...
热点如何用于期刊写作——以chatGPT为例
交叉领域A,B 以自己为例子,A是教育 B是技术,我是教育技术学专业。 经验来源 知网关于GPT的140余篇专业论文的观察 截止至2023年8月14日15:35:45 学习每出现一个热点,如何应用于学术。 实践阅读发现 套路一:谈理论…...
IGV.js 的完全本地化运行探索
问题及解决方法 IGV.js 完全本地化是为了合规,不使用外网的情况下查看基因组。不联网需要下载 genomes.json 文件及其中的内容之外,还需要修改 igv.js本身,防止5s超时后才显示网页内容。修改的关键词是: genomes.json,改为本地的…...
网络安全渗透测试之靶场训练
NWES: 7月26号武汉地震检测中心遭受境外具有政府背景的黑客组织和不法分子的网络攻击。 目前网络攻击主要来自以下几种方式: DDOS:分布式拒绝服务攻击。通过制造大量无用的请求向目标服务器发起访问,使其因短时间内无法处理大量请求而陷入瘫痪。主要针对…...
Java课题笔记~ Spring 的事务管理
一、Spring 的事务管理 事务原本是数据库中的概念,在 Dao 层。但一般情况下,需要将事务提升到业务层,即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。 在 Spring 中通常可以通过以下两种方式来实现对事务的管理ÿ…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
