当前位置: 首页 > news >正文

AOP的介绍与使用

文章目录

  • AOP的概念
  • AOP术语
  • AOP的实现
    • AspectJ
    • Spring AOP
  • Spring AOP原理
    • JDK动态代理
    • CGLib动态代理
  • SpringAOP代码编写规则
      • 自定义切面
      • 自定义切点
      • 自定义通知
      • 在通知中获取当前请求
      • 代码实例
  • 一些选择题

AOP的概念

• Aspect Oriented Programing,即面向方面(切面)编程。

• AOP是一种编程思想,是对OOP(面向对象编程)的补充,可以进一步提高编程的效率。

AOP术语

image-20240220003649308

连接点表示的并不是一个点,而是一段代码或一整个方法等

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对象:

  1. 利用 Request的工具类RequestContextHolder,通过getRequestAttributes()方法可以获得RequestAttributes类型对象

  2. ServletRequestAttributes 是 RequestAttributes 的子类,拥有更多的方法,故通常将返回类型强转为子类型

  3. 通过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;}}

一些选择题

3.34【瑞客论 坛 www.ruike1.com】

B

3.35【瑞客论 坛 www.ruike1.com】

A

3.36【瑞客论 坛 www.ruike1.com】

D

3.37【瑞客论 坛 www.ruike1.com】

D

3.38【瑞客论 坛 www.ruike1.com】

图片转存中…(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中常用的一些元件和采样器的介绍和讲解: 测试计划元件 测试计划&#xff0…...

BF算法的优化之SPFA算法

介绍 全称Shortest Path Faster Algorithm. 优化思想&#xff1a; 1.由int path[maxn]定义的记录最短距离的容器&#xff0c;只有在path[i]value<path[j]时才会更新&#xff0c;它们两者的值相等时path的值仍保持不变。由此优化容器&#xff0c;选择用一个队列来替path数…...

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…...

ctf_show笔记篇(web入门---信息收集)

目录 信息收集 1-2&#xff1a;查看源代码 3&#xff1a;bp抓包 4&#xff1a;robots.txt&#xff08;这个文件里会写有网站管理者不想让爬虫的页面或其他&#xff09; 5&#xff1a;网站源代码泄露index.phps 6&#xff1a;同样也是源码泄露&#xff0c;&#xff08;拿到…...

html基本标签

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

端游如何防破解

在2023年这个游戏大年中&#xff0c;诸多热门大作涌现&#xff0c;作为世界级IP哈利哈利波特的衍生游戏——《霍格沃茨之遗》毫无悬念地成为2023年游戏圈的首款爆款作品&#xff0c;斩获了一众玩家的青睐。 在众多光环的加持下&#xff0c;《霍格沃茨之遗》很快被著名游戏破解…...

用 TVMC 编译和优化模型(2)

文章目录 前言一、使用 TVMC二、获得模型三、将 ONNX 模型编译到 TVM 运行时中四、TVMC 从编译的模块中运行模型4.1、输入预处理4.2 运行已编译的模块4.3 输出后处理 前言 在本节中&#xff0c;将使用 TVMC&#xff0c;即 TVM 命令行驱动程序。TVMC 工具&#xff0c;它暴露了 T…...

第八节 龙晰Anolis 8.8 安装 DDE 桌面环境

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

SpringBoot之Actuator的两种监控模式

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

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

目录 PodKubernetes 网络模型同一Pod上的容器之间进行通信同一Node上的不同Pod之间进行通信不同Node上的Pod之间进行通信Service参考 Pod 首先来回顾一下Pod&#xff1a; Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载&#xff0c;并封装一…...

神经网络冻结参数后权重仍然更新

1. 背景 冻结model中的cnn1层&#xff1a; model.cnn1.requires_grad False 运行后发现cnn1的参数仍然在更新 作为一个编程菜逼&#xff0c;我乍一看没毛病呀&#xff0c;凌晨1点的我越调越迷糊&#xff0c;终于最终还是找到了问题&#xff0c;还是基础不牢 2.原因 应使…...

STM32学习7 按键扫描

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

图像物体的边界- 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给定一个二维数组M行N列&#xff0c;二维数组里的数字代表图片的像素&#xff0c;为了简化问题&#xff0c;仅包含像素1和5两种像素&#xff0c;每种像素代表一个…...

.idea文件详解

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

安卓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&#xff0c;然后遍历该数组&#xff0c;对每个域名发送HTTP请求并检查响应内容以判断域名是否被封。 具体步骤如下&#xff1a; 1. 定义待检测的域名列表。 2. 遍历域名…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...