AOP的介绍与使用
文章目录
- AOP的概念
- AOP术语
- AOP的实现
- AspectJ
- Spring AOP
- Spring AOP原理
- JDK动态代理
- CGLib动态代理
- SpringAOP代码编写规则
- 自定义切面
- 自定义切点
- 自定义通知
- 在通知中获取当前请求
- 代码实例
- 一些选择题
AOP的概念
• Aspect Oriented Programing,即面向方面(切面)编程。
• AOP是一种编程思想,是对OOP(面向对象编程)的补充,可以进一步提高编程的效率。
AOP术语
连接点表示的并不是一个点,而是一段代码或一整个方法等
AOP的实现
AspectJ
- AspectJ是语言级的实现(一种新的语言),它扩展了Java语言,定义了AOP语法。
- AspectJ在编译期织入代码,它有一个专门的编译器,用来生成遵守Java字节码规范的class文件。
Spring AOP
- Spring AOP使用纯Java实现,它不需要专门的编译过程,也不需要特殊的类装载器。
- Spring AOP在运行时通过代理的方式织入代码,只支持方法类型的连接点。
- Spring支持对AspectJ的集成。(遇到解决不了得问题,再用AspectJ)
Spring AOP原理
代理:给某个对象生成一个新的对象来代替它,调用时仅调用代理对象,而不调用原始对象
Spring中的bean都是通过容器去调用的,当容器调用时发现目标对象上有AOP的作用,就会去找代理对象,调用代理对象,而代理对象上有织入的代码,能解决问题。
JDK动态代理
目标对象必须要有接口(要求),才能被代理。代理时,自动生成接口的实现类,代替原实现类
- Java提供的动态代理技术,可以在运行时创建接口的代理实例。
- Spring AOP默认采用此种方式,在接口的代理实例中织入代码。
CGLib动态代理
创建目标对象的子类,用子类代替原来的对象(java支持多态,故可用子类型来代替父类型)
- 采用底层的字节码技术,在运行时创建子类代理实例。
- 当目标对象不存在接口时,Spring AOP会采用此种方式,在子类实例中织入代码。
SpringAOP代码编写规则
自定义切面
@Aspect:声明当前类是一个切面组件
@Component // 将切面组件声明为bean令容器管理它
@Aspect
public class AlphaAspect { ... ... }
自定义切点
@Pointcut:自定义切点,声明当前方法是切点。
自定义一个空方法,加上 @Pointcut 注解,在注解中声明要将切面织入到哪些bean哪些方法中,即使用哪些连接点
* 符号表示任意,在不同位置代表不同的数据
* 在开头方法返回值位置上,代表任意类型的返回值
com.nowcoder.community.service.*.*(…) : service包下的 任意类中 的 任意方法,(…) 表示方法的所有参数
execution(* com.nowcoder.community.service..(…)): 表示service包下所有 业务组件(即类)的所有方法(不限参数和返回值)都要处理,都要匹配
@Pointcut("execution(* com.nowcoder.community.service.*.*(..))")public void pointcut() {}
自定义通知
自定义方法上加不同注解 表示在连接点不同位置织入当前代码,注解中需指定 针对哪些连接点植入该方法,即适用的链接点范围
@Before:连接点前植入代码
@After:连接点后植入代码
@AfterReturning:抛异常时植入代码
@Around:连接点前后都植入代码
@After("pointcut()")public void after() {System.out.println("after");}
自定义的方法可以带上一个参数,代表连接点对象。通过连接点对象可以获取链接点的信息,如连接点在哪个类中,是哪个方法。或调用连接点中的代码执行
-
@Around标识的方法中加 ProceedingJoinPoint
@Around("pointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("around before");// proceed() 调用目标组件的方法,用Object接收目标组件方法的返回值Object obj = joinPoint.proceed();System.out.println("around after");return obj;}
-
其他注解 标识的方法中加 JoinPoint
@Before("pointcut()")public void before(JoinPoint joinPoint) {// 得到织入目标类名String className = joinPoint.getSignature().getDeclaringTypeName();// 得到织入目标方法名String functionName = joinPoint.getSignature().getName();System.out.println(className+"."+functionName);}
在通知中获取当前请求
目的:当前请求对象中包含很多信息,如用户ip地址,请求内容等,通过请求对象我们可以获取这些信息
用于通知的方法不可以随意添加Request对象作为参数
获取Request对象:
-
利用 Request的工具类RequestContextHolder,通过getRequestAttributes()方法可以获得RequestAttributes类型对象
-
ServletRequestAttributes 是 RequestAttributes 的子类,拥有更多的方法,故通常将返回类型强转为子类型
-
通过ServletRequestAttributes可以获得Request对象
@Before("pointcut()")public void before() {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();}
代码实例
@Component // 将切面组件声明为bean令容器管理它
@Aspect // 表示这是一个切面组件
public class AlphaAspect {// SpringAOP仅支持方法类型连接点@Pointcut("execution(* com.nowcoder.community.service.*.*(..))")public void pointcut() {}// 连接点前植入代码@Before("pointcut()")public void before() {// 打印ip:用户ip地址要从request中获取ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String ip = request.getRemoteHost();System.out.println(ip);}// 连接点后植入代码@After("pointcut()")public void after() {System.out.println("after");}// 连接点有返回值以后植入代码@AfterReturning("pointcut()")public void afterRetuning() {System.out.println("afterRetuning");}// 抛异常时植入代码@AfterThrowing("pointcut()")public void afterThrowing() {System.out.println("afterThrowing");}// 连接点前后都植入代码@Around("pointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("around before");// proceed() 调用目标组件的方法,用Object接收目标组件方法的返回值Object obj = joinPoint.proceed();System.out.println("around after");return obj;}}
一些选择题
B
A
D
D
图片转存中…(img-sP6qo5m5-1709223538149)]
B
[外链图片转存中…(img-zaELyrk5-1709223538150)]
A
[外链图片转存中…(img-44XalgTf-1709223538150)]
D
[外链图片转存中…(img-7ey2TUah-1709223538150)]
D
[外链图片转存中…(img-yevsttjk-1709223538151)]
A
相关文章:

AOP的介绍与使用
文章目录 AOP的概念AOP术语AOP的实现AspectJSpring AOP Spring AOP原理JDK动态代理CGLib动态代理 SpringAOP代码编写规则自定义切面自定义切点自定义通知在通知中获取当前请求代码实例 一些选择题 AOP的概念 • Aspect Oriented Programing,即面向方面(…...

金融行业专题|期货超融合架构转型与场景探索合集(2023版)
更新内容: 更新 SmartX 超融合在期货行业的覆盖范围、部署规模与应用场景。新增 CTP 主席系统实践与评测、容器云资源池等场景实践。更多超融合金融核心生产业务场景实践,欢迎下载阅读电子书《SmartX 金融核心生产业务场景探索文章合集》。 面对不断变…...

08 yum和git
什么是软件包 安装软件,一个通常的办法就是下载程序的源代码进行编译。这种太麻烦,于是一些人把常用软件编译好,做成软件包放在服务器上,通过包管理器可以很方便的得到这个软件包安装,就好比手机上的应用商店 yum&am…...
JMeter元件和采样器一览
Apache JMeter是一个强大的开源负载测试工具,用于性能和功能测试。JMeter提供了丰富的元件和采样器,使得它能够模拟复杂的测试场景和高并发的用户请求。以下是JMeter中常用的一些元件和采样器的介绍和讲解: 测试计划元件 测试计划࿰…...
BF算法的优化之SPFA算法
介绍 全称Shortest Path Faster Algorithm. 优化思想: 1.由int path[maxn]定义的记录最短距离的容器,只有在path[i]value<path[j]时才会更新,它们两者的值相等时path的值仍保持不变。由此优化容器,选择用一个队列来替path数…...

java 基础(核心知识搭配代码)
前言 java的学习分为了上部分以及下部分进行学习,上部分就是对于java的基础知识,面向对象上,面向对象下,异常操作,javaApi;下部主要是集合,泛型,反射,IO流,J…...
ctf_show笔记篇(web入门---信息收集)
目录 信息收集 1-2:查看源代码 3:bp抓包 4:robots.txt(这个文件里会写有网站管理者不想让爬虫的页面或其他) 5:网站源代码泄露index.phps 6:同样也是源码泄露,(拿到…...

html基本标签
<h1></h1> <p></p> h是标签从h1~h6,没用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平台</a> href可以指定链接进行跳转 <img src"https://www.educoder.net/attachments/download/2078…...

端游如何防破解
在2023年这个游戏大年中,诸多热门大作涌现,作为世界级IP哈利哈利波特的衍生游戏——《霍格沃茨之遗》毫无悬念地成为2023年游戏圈的首款爆款作品,斩获了一众玩家的青睐。 在众多光环的加持下,《霍格沃茨之遗》很快被著名游戏破解…...
用 TVMC 编译和优化模型(2)
文章目录 前言一、使用 TVMC二、获得模型三、将 ONNX 模型编译到 TVM 运行时中四、TVMC 从编译的模块中运行模型4.1、输入预处理4.2 运行已编译的模块4.3 输出后处理 前言 在本节中,将使用 TVMC,即 TVM 命令行驱动程序。TVMC 工具,它暴露了 T…...

第八节 龙晰Anolis 8.8 安装 DDE 桌面环境
一、前言 最小化安装的龙晰 Anolis OS 8.8 是不带图形化界面的,只能使用命令行,有些时候需要用到桌面环境,而DDE (Deepin Desktop Enviroment) 就是很好的桌面环境,它是指龙晰 Anolis 所搭载的中国自主桌面环境,用起来…...

SpringBoot之Actuator的两种监控模式
SpringBoot之Actuator的两种监控模式 springboot提供了很多的检测端点(Endpoint),但是默认值开启了shutdown的Endpoint,其他默认都是关闭的,可根据需要自行开启 文章目录 SpringBoot之Actuator的两种监控模式1. pom.xml2. 监控模式1. HTTP2. JMX 1. pom.xml <de…...

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?
目录 PodKubernetes 网络模型同一Pod上的容器之间进行通信同一Node上的不同Pod之间进行通信不同Node上的Pod之间进行通信Service参考 Pod 首先来回顾一下Pod: Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并封装一…...
神经网络冻结参数后权重仍然更新
1. 背景 冻结model中的cnn1层: model.cnn1.requires_grad False 运行后发现cnn1的参数仍然在更新 作为一个编程菜逼,我乍一看没毛病呀,凌晨1点的我越调越迷糊,终于最终还是找到了问题,还是基础不牢 2.原因 应使…...

STM32学习7 按键扫描
STM32学习7 按键扫描 一、实验电路介绍二、按键GPIO初始化三、扫描原理1. GPIO引脚配置2. 状态轮询3. 按键状态检测4. 循环扫描的优缺点优点:缺点: 四、一次扫描与持续扫描五、代码实现1. 头文件定义2. 函数实现3. 主体函数 一、实验电路介绍 本实验使用…...

图像物体的边界- 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个…...

.idea文件详解
.idea文件的作用: .idea文件夹是存储IntelliJ IDEA项目的配置信息,主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除,因为这个文件下保存的…...

安卓JNI基础知识
JNI基础知识 JNI简介NDK配置开发环境JNI实践配置CMakeJNI编码JNI注册1.静态注册2.动态注册 编译方式CMakeLists编译Makefile编译命令编译 JNI和C/C代码分离Java调用C/C查看so中包含的方法 C/C调用Java打印C/C的log生成多个共享库soJNI调试 本文整理了JNI技术基础知识 JNI简介 …...

Nginx高级技巧:实现负载均衡和反向代理
文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…...

2024年2月最新微信域名检测拦截接口源码
这段PHP代码用于检测指定域名列表中的域名是否被封。代码首先定义了一个包含待检测域名的数组 $domainList,然后遍历该数组,对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下: 1. 定义待检测的域名列表。 2. 遍历域名…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...