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. 遍历域名…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
