【Spring面试题】AOP相关面试题:概念?使用场景?如何使用?核心?

news2024/10/1 19:30:17

什么是AOP

         AOP是面向切面,面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。对多个对象共同行为封装成一个模块叫切面,然后某个方法为切点

        通俗的讲:就是在一些代码中做重复操作的时候,我们为了实现代码的复用性,统一去处理这些工作,让后让我们得操作自然的嵌入(用自定义注解)到指定方法的指定位置。

        利用AOP可以对业务逻辑 的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高 了开发的效率。

如下图所示:         把水平面抽象成一个切面对象,我们把日志代码放到切面对象中,然后对这个切面对象去编程,本质上还是面向对象编程,但是思想是面向切面编程。 通过aop可以对其进行增强,减少重复代码,降低耦合。基于代理实现。

5个关键术语

1)横切关注点,从每个方法中抽取出来的同一类非核心业务

2)切面(Aspect),对横切关注点进行封装的类,每个关注点体现为一个通知方法;通常使用 @Aspect 注解来定义切面。

3)通知(Advice),切面必须要完成的各个具体工作,比如我们的日志切面需要记录接口调用前后的时长,就需要在调用接口前后记录时间,再取差值。通知的方式有五种:

  • @Before:通知方法会在目标方法调用之前执行

  • @After:通知方法会在目标方法调用后执行

  • @AfterReturning:通知方法会在目标方法返回后执行

  • @AfterThrowing:通知方法会在目标方法抛出异常后执行

  • @Around:把整个目标方法包裹起来,在被调用前和调用之后分别执行通知方法

4)连接点(JoinPoint),通知应用的时机,比如接口方法被调用时就是日志切面的连接点。

5)切点(Pointcut),通知功能被应用的范围,比如本篇日志切面的应用范围是所有 controller 的接口。通常使用 @Pointcut 注解来定义切点表达式。

项目中使用过AOP吗?AOP使用场景?

我的项目里面,日志操作用过。

用户请求的时候,我们需要记录下这些操作,例如需要记录操作的用户是谁、请求方式是什么、访问地址、模块名称、登录IP、操作时间等。就用到了这个AOP。具体如何操作,看下面如何使用AOP。

常用的使用场景

  1. 记录操作日志

  2. 缓存处理

  3. Spring中内置的事务

如何使用AOP?

例如日志操作:日志操作的核心是使用aop中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数,保存到数据库。

日志用来记录一下请求的方式(解析方法可以获取)、URL、用户名(解析Session可以获取)、操作时间等。

        1. 在项目中导入AOP,就是导入到xml文件中

        2. 在切面类上加一个注解@Aspect,表明这是切面类。例如日志操作,那你的切面类里面就需要写一些业务:获取操作时间、操作人的用户名(可以用Session或token获取)、访问的URL、请求方式等,然后将这些记录到数据库。

        3. 自定义一个注解,用来标注你要做的公共代码。  

                有的代码需要记录日志,有的不需要,那就用这个注解来表示哪些需要做日志。

AOP核心:动态代理

        将程序中的业务逻辑加到目标类上,就会涉及到动态代理,AOP的核心技术是动态代理,体现动态代理核心(mybatis的dao层其实就是使用到了jdk动态代理,只有接口)需要通过CGlib生成实现类,作为模板类,给代理使用,Spring通过代理,引入模板类,生成代理类对象,invoke调用对象的Method方法,传入目标类对象和参数,完成动态代理

Spring AOP和 AspectJ AOP有什么区别?

  • springAOP 是spring支持的面向切面AOP 编程。

  • AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

springAOP 不是一个完备的AOP 方案。

AspectJ是最首创的AOP技术,用来提供全面的AOP方案。

Spring AOP属于运行时增强而Aspect是编译时增强。Spring AOP 基于代理(Proxying),而AspectJ基于字节码操作(Bytecode Manipulation)。 Spring AOP已经集成了Aspectl, Aspectl应该算的上是Java生态系统中最完整的 AOP框架了。Aspectl相比于Spring AOP功能更加强大,但是 Spring AOP相对来说更简单, 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择Aspectl,它比Spring A0P.快很多。 同级调用方法不可切入

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

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

相关文章

使用Pritunl OpenVPN远程连接:实现安全高效的远程访问

文章目录 前言1.环境安装2.开始安装3.访问测试4.创建连接5.局域网测试连接6.安装cpolar7.配置固定公网访问地址8.远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件(但使用的不是标准的开源许可证,用户受到很多限制)。这是一种简单有…

大数据与AI:解析智慧城市的幕后英雄

文章目录 1. 智慧城市的定义与发展2. 大数据:智慧城市的基石2.1 大数据的概念与重要性2.2 大数据的应用案例2.2.1 智能交通管理2.2.2 能源效率优化2.2.3 城市规划与土地利用 3. 人工智能:智慧城市的大脑3.1 人工智能的概念与重要性3.2 人工智能的应用案例…

【网络通信 -- WebRTC】Open WebRTC Toolkit 环境搭建指南

【网络通信 -- WebRTC】Open WebRTC Toolkit -- OWT-Server 编译安装指南 【1】OWT Server 与 Web Demo 视频会议环境搭建 【1.1】编译 OWT Server 安装依赖 ./scripts/installDepsUnattended.sh编译 scripts/build.js -t all --check 注意若不支持硬件加速则采用如下命令 s…

C++的命名空间namespace详解及特殊情况分析

这里写目录标题 历史来源意义定义使用using namespace std弊端 历史来源 最开始的C 头文件仍然以.h为后缀,它们所包含的类、函数、宏等都是全局范围的。后来 C 引入了命名空间,计划重新编写库将类、函数、宏等都统一纳入一个命名空间std 但改版后的c库致使旧c库无法…

springboot 下 activiti 7会签配置与实现

流程图配置 会签实现须在 userTask 节点下的 multi instance 中配置 collection 及 completion condition; collection 会签人员列表;element variable 当前会签变量名称,类似循环中的 item;completion condition: 完成条件。 ${taskExecutionServiceIm…

Credo推出业界首款单片集成CMOS VCSEL驱动器的800G光DSP芯片

针对AOC及短距(SR)光模块优化的新型Credo DSP,适用于下一代超大规模数据中心/AI应用 加州圣何塞和中国深圳,2023年9月6日——Credo Technology(纳斯达克股票代码:CRDO)今日发布两款新品&#x…

EasyPhoto:基于 SD WebUI 的艺术照生成插件来啦!

作者 :wuziheng 背景介绍 最近,基于生成式AI技术批量产出真/像/美的个人写真应用非常受欢迎。同时,随着 Stable Diffusion 领域开源社区的快速发展,社区也涌现了类似 FaceChain 的开源项目,帮助开发者开发个性化的真…

14 合并区间

合并区间 题解1 左端点排序后合并(可证连续,贪心)题解2 双指针(优化) 以数组 i n t e r v a l s intervals intervals 表示若干个区间的集合,其中单个区间为 i n t e r v a l s [ i ] [ s t a r t i , e n…

计算机视觉-OpenCV入门讲解

🎉作者简介:在读计算机研究生,目前研二。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法目前正在学习深度学习的相关内容。 📃个人主页&…

jar包或exe程序设置为windows服务

最近在使用java和python制作客户端时突发奇想,是否能够通过一种方法来讲jar包和exe程序打包成windows服务呢?简单了解了一下是可以的。 首先要用到的是winSW,制作windows服务的过程非常简单,仅需几步制作完成,也不需要…

2023 Google 开发者大会

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

C++(Liunx) 使用cut截 取出Ubuntu用户的家目录,要求:不能使用“:“作为分割.

使用cut截 取出Ubuntu用户的家目录,要求:不能使用":"作为分割

spawnsync pnpm.cmd enoent

解决: 安装pnpm npm install pnpm -g

深入解析JDK 8 HashMap

HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。 HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个 JDK1.8…

自从学会了ChatGPT,我就再没加过班

不会吧不会吧,竟然还有程序员没学会ChatGPT?据说早学会ChatGPT的程序员已经开挂了! 不仅实现了按时下班的人生理想,还拥有了升职加薪的意外收获,在开挂人生的另一边却仍有人担心自己会被ChatGPT取代!因为C…

【高阶数据结构】红黑树 {概念及性质;红黑树的结构;红黑树的实现;红黑树插入操作详细解释;红黑树的验证}

红黑树 一、红黑树的概念 红黑树(Red Black Tree) 是一种自平衡二叉查找树,在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有…

A145-FR04HS-60变量柱塞泵控制比例放大器

本比例放大器驱动电比例泵、比例压力阀、比例流量阀、比例减压阀、比例方向阀、比例插装阀、比例溢流阀、比例节流阀、比例换向阀控制。 输入指令、最大、最小电流、上升、下降斜坡时间、颤振频率等可现场设置; 带数码显示,可查看设置参数及故障报警提…

vue-cli中总提示组件没有正确注册

这里写目录标题 一、报错提示二、修改办法 一、报错提示 二、修改办法 <template><div><aside-component style"width: 15%"></aside-component></div> </template><script> import AsideComponent from /components/Asi…

JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)

基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能&#xff1a; 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…

06-JVM对象内存回收机制深度剖析

上一篇&#xff1a;05-JVM内存分配机制深度剖析 堆中几乎放着所有的对象实例&#xff0c;对堆垃圾回收前的第一步就是要判断哪些对象已经死亡&#xff08;即不能再被任何途径使用的对象&#xff09;。 1.引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引…