Spring Boot (9):AOP实战经验

1 概述

          介绍完Spring AOP所具备的功能特性,接下来,看一下再应用程序中使用AOP时应该遵循哪些最佳实践。

2 活用切点表达式

        Spring AOP的一大特色在于在开发人员提供了非常灵活的切点机制。Spring在编译期间处理切入点,并尝试进行优化匹配。然后,检查代码中的匹配规则将是一个代价高昂的过程。因此,为了获得最佳性能,需要仔细考虑想要实现的目标,并尽可能缩小搜索或匹配条件的范围。在前面已经看到过一个切点表达式,如下:

@Pointcut("execution(* com.jay.aop.service.AccountService.doAccountTransaction(..))")public void doAccountTransaction(){}

        在这里的execution()代表的就是表达式的主体,它的基本语法如下,其中“?”部分表示可选项。

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(paramPattern)throws-pattern?)                

        这个表达式看似复杂,但是逐步分解所有的模式,它们其实就是描述了一个方法的特征。

        modifiers-pattern:表示方法的修饰符

        ret-type-pattern:表示方法的返回值

        declaring-type-pattern:表示方法所在的类的路径

        name-pattern:表示方法名

        param-pattern:表示方法的参数

        throws-pattern:表示方法抛出异常。

        这些模式的作用就是完成切点的匹配。在各个模式中,可以使用"*"来表示匹配所有选项。Spring AOP还为开发人员提供了一组非常有用的描述符来简化切点表达式的使用过程。例如,args描述符表示方法的参数属于一个特定的类;within描述符表示方法属于一个特定类;target描述符表示方法所属的类等。

        为了获得良好的性能,在设计切点表达式时,至少应该包含方法和类型模式。这并不是说如果只使用方法或类型模式中的一种,匹配就会不生效,而是因为类型模式的匹配过程非常快,它通过快速选择无法进一步处理的连接点来缩小搜索空间。同时,建议在空方法上声明切点,并通过空方法引用这些切点。

        另一种最佳实践在于尽量声明小的切点,并把它们组合起来构建复杂的切点。下面代码展示了定义小切点并将它们连接起来的代码实例。

@Pointcut("execution(public * *(..))")private void anyPublicMethod(){}@Pointcut("execution(* com.jay.aopproxy.service.impl.AccountServiceImpl.doAccountTransaction(..))")public void doSomething(){}@Pointcut("anyPublicMethod() && doAccountTransaction()")private void transactionOperation(){}

        这里的transactionOperation()就是由anyPublicMethod()和doAccountTransaction()这两个切点组合而成的。

3 Spring AOP面试题分析

3.1 Spring AOP是基于什么技术体系实现的?

        解答:Spring AOP的实现依赖代理机制。代理机制在具体实现上一般有两种方式,一种是静态代理机制,一种是动态代理机制。Spring AOP基于动态代理模式提供了面向切面机制。

3.2 Spring AOP提供了那些类型的通知机制?

        解答:Spring AOP的通知机制类型非常丰富,开发人员可以在方法执行之前、之后、前后、返回以及抛出异常时实现各种自定义的通知逻辑。而且,Spring AOP实现通知的方式使用注解来标记,这些注解包括@Before、@After、@Around、@AfterReturning和@AfterThrowing等,分别对应于方法执行的各个阶段。

3.3 Spring AOP使用了哪几种动态代理机制?性能上哪种更优?

        解答:常见的动态代理实现技术包括JDK自带的代理类、第三方的CGLIB和javassist。Spring AOP使用的是JDK和CGLIB。从性能上讲,JDK动态代理效率高于CGLIB。

3.4 如果想要在一个类的内部方法实现AOP,有什么办法?

        解答:关于Spring AOP有一点需要注意,只能在方法的调用过程中嵌入通知机制。这是一个很重要的限制,会导致对同一个类中的内部方法无法有效地实施动态代理。这是用可以使用Spring AOP提供的AopContext上下文对象来获取当前的AOP代理。AopContext是一个非常有用的工具类,想要获取该类,需要确保ProxyFactoryBean的exposeProxy属性被设置为true。

3.5 如果想要基于Spring AOP实现对切点的精细化管理,有什么策略?

        解答:Spring AOP创建切点的方式是非常灵活的,Spring专门提供了一个execution()配置方法。可以根据方法的修饰符、返回值、类路径、方法名、方法参数以及异常信息来设置方法调用与切点的匹配规则。这是实现精细化管理的一个维度。

        第二个精细化管理的维度是设置切点的粒度。可以尽量声明小的切点,并把它们组合起来构建复杂的切点。这样,切点之间就具备了灵活的可重用性以及组合性。

       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机的错误计算(二十四)

摘要 计算机的错误计算(二十一)就案例 展示了“两个不相等数相减,差为0”。本节给出新的计算过程:不停增加计算精度直到出现非0结果。这个过程与结果表明,即使是专业数学软件,对这个问题的处理&#xff0…

1 HTML and CSS

HTMl(超文本标记语言) HTML 概述 超文本标记语言用来描述和定义网页的内容 HTML(超文本标记语言——HyperText Markup Language)是构成 Web 世界的一砖一瓦;它定义了网页内容的含义和结构 “超文本”(hypertext)是指连接单个网站内或多个网站间的网页的链接 1. HTML标签功能区分…

Qt之多线程编程(QThread)

文章目录 前言Qt多线程的基本使用如何移动线程常用的一些函数示例代码总结 前言 在现代计算机系统中,多线程编程已经成为一种常见的编程模式,它可以有效地利用多核处理器的计算能力,提高程序的执行效率。Qt作为一种跨平台的应用程序开发框架…

【ffmpeg系列一】源码构建,ubuntu22与win10下的过程对比。

文章目录 背景ubuntu22结论 win10过程 对比结论 背景 顺手编译个ffmpeg试试,看看不同平台下谁的配置比较繁琐。 先让gpt给出个教程: ubuntu22 使用elementary-os7.1构建,看看有几个坑要踩。 错误1: 依赖libavresample-dev未…

Linux-学习-05-openssl安装与卸载

目录 一、环境信息 二、卸载步骤 1、使用包管理器卸载 三、安装步骤 1、下载OpenSSL源代码 2、解压并进入目录 3、配置、编译和安装 4、更新软链接 5、更新共享库缓存 6、/etc/profile添加环境变量 7、环境变量生效 8、openSSL版本验证 一、环境信息 名称值CPUInte…

【人工智能】-- 智能家居

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉基于深度卷积神经网络的表情识别 🍈流程图 🍈模型设计 🍍网络架…

[图解]企业应用架构模式2024新译本讲解24-标识映射3

1 00:00:00,460 --> 00:00:02,580 超类定义了一个抽象方法 2 00:00:03,170 --> 00:00:03,450 3 00:00:06,410 --> 00:00:09,690 把reader内容 4 00:00:10,870 --> 00:00:12,350 把它变成一个领域对象 5 00:00:13,690 --> 00:00:15,800 但这里只是把它变成一个…

python安装PyTorch+cuda

1,最终结果 import torchprint(torch.cuda.is_available()) #显示True,则安装成功 print(torch.__version__)#打印当前PyTorch版本号。 print(torch.version.cuda)#打印当前CUDA版本号。 print(torch.backends.cudnn.version())# 打印当前cuDNN版本号。 print(torc…

Ruby 语法

Ruby 语法 Ruby 是一种动态、开放源代码的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年开发。Ruby 的设计哲学强调简洁和效率,同时也是一种表达力强的语言。它结合了多种编程语言的特性,包括 Perl、Smalltalk、Eiffel、Ada 和 Lisp。Ruby 的语法简单直观,使得…

【爱上C++】vector用法详解

文章目录 一:vector简介二:vector的创建和初始化三:vector的遍历1.[]下标2.at()3.迭代器遍历4.范围for 四:vector的空间1.size2.max_size3.capacity4.reserve5.resize6.empty 五:vector的增删查改1.push_back2.pop_back3.find4.insert5.erase6.swap7.assign Hello~同学们好&…

mAP(平均精度均值)全面解读:评估目标检测性能的黄金标准

mAP(平均精度均值)全面解读:评估目标检测性能的黄金标准 在目标检测领域,评估模型性能是至关重要的一步。mAP(mean Average Precision,平均精度均值)作为目标检测任务中一个关键的性能评估指标…

搭建纯净的SpringBoot工程

pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVe…

docker nginx mysql redis

启动没有数据卷的nginx docker run -d -p 86:80 --name my-nginx nginx把/etc/nginx中的配置复制到宿主机 docker cp my-nginx:/etc/nginx /home/nginxlkl把/html 中的文件复制到宿主机 docker cp my-nginx:/etc/nginx /home/nginxlkl删除当前镜像 docker rm -f my-nginx重新起…

ArrayList,Vector, LinkedList的存储性能和特性举例说明

ArrayList、Vector、LinkedList是Java中常用的三种集合类型&#xff0c;它们各自具有不同的存储性能和特性。下面将分别举例说明这三种集合的存储性能和特性&#xff1a; ArrayList 存储性能与特性&#xff1a; 底层实现&#xff1a;ArrayList底层是通过数组实现的&#xff…

Solidity:变量数据存储和作用域 storage/memory/calldata

Solidity中的引用类型​ 引用类型(Reference Type)&#xff1a;包括数组&#xff08;array&#xff09;和结构体&#xff08;struct&#xff09;&#xff0c;由于这类变量比较复杂&#xff0c;占用存储空间大&#xff0c;我们在使用时必须要声明数据存储的位置。 数据位置​ …

HarmonyOS ArkUi 字符串<展开/收起>功能

效果图&#xff1a; 官方API&#xff1a; ohos.measure (文本计算) 方式一 measure.measureTextSize 跟方式二使用一样&#xff0c;只是API调用不同&#xff0c;可仔细查看官网方式二 API 12 Preview Component export struct CustomTextSpan {State maxLines: number 1/…

迭代器模式(大话设计模式)C/C++版本

迭代器模式 C #include <iostream> #include <string> #include <vector>using namespace std;// 迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法&#xff0c;统一接口 class Iterator { public:Iterator(){};virtu…

作为产品经理,如何用大模型给我们赋能?非常详细,收藏我这篇就够了

作为一名产品经理&#xff0c;如果您考虑转行至大模型领域&#xff0c;您将能够将产品管理技能与大模型技术相结合&#xff0c;从而在产品开发和创新方面获得一系列好处。以下是转行大模型对产品经理的一些潜在益处&#xff1a; 更深入的技术理解&#xff1a;了解大模型技术将…

LeetCode 1351, 1, 208

目录 1351. 统计有序矩阵中的负数题目链接标签简答二分查找思路代码 优化思路代码 1. 两数之和题目链接标签思路代码 208. 实现 Trie (前缀树)题目链接标签思路代码 1351. 统计有序矩阵中的负数 题目链接 1351. 统计有序矩阵中的负数 标签 数组 二分查找 矩阵 简答二分查找…

使用 Python 处理 Lumerical 导出的 .txt 文件(完结)

使用 Python 处理 Lumerical 导出的 .txt 文件 引言正文以 , 隔开的波长与透射率以 \t 隔开的波长与透射率引言 之前在 添加链接描述 一文中我们已经介绍了如何将 Lumerical 仿真中的 S 参数相关数据导出为 .txt 文件。这里我们来分享如何使用 Python 对这些数据进行处理。 正…