AOP-面向切面编程

文章目录

  • AOP应用背景
  • AOP介绍
  • AOP七大术语
    • 切点表达式

AOP应用背景

一天,项目经理突然跟我说:官网后端管理系统需要增加“用户操作流水功能”!啥,用户操作流水?对,记录后台管理用户的所有增删改查的操作,有操作人,操作描述,操作时间,操作url等信息。。。好的,保证完成任务!

思考:增加用户操作流水会带来什么问题?

1.目前官网管理后台的所有业务功能都已经线上正常运行了,要改动现有正常运行的线上代码,有很大的风险。
2.能不能在不影响正常业务代码的情况下,零浸入式的实现用户操作流水功能?
3.不可能使用大量冗余的代码,给所有不同的业务功能都加上相同的操作流水的代码,这样无疑是重复且巨大的工作量!

于是它来了,AOP-面向横切面编程。

AOP介绍

如上背景介绍所述:记录用户操作流水实际上就是给系统增加用户“日志”的系统功能。像:日志,事务管理,安全等,这些系统服务被称为"交叉业务"这些"交叉业务"几乎是通用的,这些交叉业务时每个项目系统都需要的。"交叉业务"在系统中的影响1.如果交叉业务代码在多个业务流程中反复出现,显然这个交叉业务代码没有得到复用,如果将来交叉业务代码又需要修改的话,会出现牵一发而动全身的连锁反应。2.这些"交叉代码"无关于业务代码,植入业务代码中侵入型很大,后期不好维护,应该抽取出来

AOP:将于核心业务无关的代码独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式切入到业务流程当中。

AOP(Aspect Oriented Programming):面向切面编程,面向方面编程AOP是对OOP的补充延伸,AOP底层就是由动态代理来实现的。SpringAOP使用的动态代理是:JDK动态代理+CGLib动态代理技术。Spring在这两种动态代理中灵活切换,如果是代理接口,会默认使用JDK动态代理,如果要代理某个类,这个类没有实现接口,就会切换使用CGLib,当然,你也可以强制通过一些配置让Spring只使用CGlibAOP的优点:1.代码复用性增强2.代码易于维护3.使开发者更关注业务逻辑

在这里插入图片描述

AOP七大术语

连接点(Joinpoint):在程序的整个执行流程中,可以织入切面的位置,例如方法的执行前后,异常抛出之后等位置。切点(Pointcut):在程序执行流程中,真正织入切面的方法(一个切点对应多个连接点)通知(Advice):通知也称增强,就是具体你要织入的代码。通知包括;前置通知,后置通知,环绕通知,异常通知,最总通知● 前置通知(Before):在目标方法调用前调用通知功能;● 后置通知(After):在目标方法调用之后调用通知功能,不关心方法的返回结果;● 环绕通知(Around):通知包裹了目标方法,在目标方法调用之前和之后执行自定义的行为;● 异常通知(AfterThrowing):在目标方法抛出异常后调用通知功能;● 最终通知(AfterReturning):在目标方法成功执行之后调用通知功能;切面(Aspect):  切点+通知就是切面织入(Weaving): 把通知应用到目标对象上的过程代理对象(Proxy): 一个目标对象被织入通知后产生的新对象目标对象(Target): 被织入通知的对象

在这里插入图片描述

切点表达式

切点表达式用来定义通知(Advice)往哪些方法上切入
切入点表达式格式:

execute([访问控制权限修饰符] 返回值类型 [全限定类名]方法名(形式参数列表) [异常])访问控制权限修饰符:1.可选项,没写就是4个权限都包括2.public就表示值包括公开的方法返回值类型:1.必填项2.*表示返回值类型任意全限定类名:1.可选项2.两个点".."代表当前包以及子包下的所有类。3.省略时表示所有的类。方法名:1.必填项2.*表示所有方法3.set*表示所有的set方法形式参数列表:1.必填项2.()表示没有参数的方法3.(..)参数类型和个数随意的方法4.(*,String)第一个参数类型随意,第二个参数是String//com.macro.mall.controller包中所有类的public以delete开头的方法都应用切面里的通知execution(public * com.macro.mall.controller.*.delete*(..))//com.macro.mall包及包含controller的子包下所有类中的所有方法都应用切面里的通知execution(public * com.macro.mall.*.controller.*.*(..))//com.macro.mall.controller.PmsBrandController类中的所有方法都应用切面里的通知execution(* com.macro.mall.controller.PmsBrandController.*(..))//所有类的所有方法execution(* *(..))

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

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

相关文章

mac删除带锁标识的app

一 、我们这里要删除FortiClient.app 带锁 常规方式删除不掉带锁的 app【如下图】 二、删除命令,依次执行即可。 /bin/ls -dleO /Applications/FortiClient.app sudo /usr/bin/chflags -R noschg /Applications/FortiClient.app /bin/ls -dleO /Applications/Forti…

QT信号与槽实现方式

1、第一种实现方式 在QT开发工具UI界面先拖入按钮,然后鼠标右键拖入按钮,点击选中槽,在页面选着需要的信号,然后OK,随即将会跳转到类的.cpp文件,(这种UI代码结合的方式,会自动去绑定…

【洛谷 P8637】[蓝桥杯 2016 省 B] 交换瓶子 题解(贪心算法)

[蓝桥杯 2016 省 B] 交换瓶子 题目描述 有 N N N 个瓶子,编号 1 ∼ N 1 \sim N 1∼N,放在架子上。 比如有 5 5 5 个瓶子: 2 , 1 , 3 , 5 , 4 2,1,3,5,4 2,1,3,5,4 要求每次拿起 2 2 2 个瓶子,交换它们的位置。 经过若干次…

AIGC笔记--关节点6D位姿按比例融合

1--核心代码 6D位姿一般指平移向量和旋转向量,Maya软件中关节点的6D位姿指的是相对平移向量和欧拉旋转向量; 为了按比例融合两个Pose,首先需要将欧拉旋转向量转换为旋转矩阵,在将旋转矩阵转换为四元数,利用球面线性插值…

react native常用插件

react-native-async-storage/async-storage 说明:AsyncStorage 是一个在 react-native 中轻量存储的库;跟 localStorage 类似,API 也几乎一样;存储的时候需要将存储内容转成字符串存储。 react-navigation/material-bottom-tabs …

如何在WordPress网站上设置多语言展示

在今天的全球化世界中,拥有多语言网站对于吸引更广泛的受众至关重要。前不就我们遇到Hostease的客户咨询我们的在线客服,他想要对他的wordpress网站支持多语言。我们提供给客户可以尝试以下的插件来支持多语言。 在本教程中,我们将逐步介绍如…

教你三指针拿捏链表翻转

类似上图,其实步骤很简单,用三个指针pre,cur,temp,看英文也知道具体含义,前向,当前,和用于保存剩余的链表 ,具体看下图,很清晰 class Solution { public:List…

AI-逻辑回归模型

😆😆😆感谢大家的支持~😆😆😆 逻辑回归的应用场景 逻辑回归(Logistic Regression)是机器学习中的 一种分类模型 ,逻辑回归是一种分类算法,虽然名字中带有回…

Java代码基础算法练习---2024.3.14

其实这就是从我学校的资源,都比较基础的算法题,先尽量每天都做1-2题,练手感。毕竟离我真正去尝试入职好的公司(我指的就是中大厂,但是任重道远啊),仍有一定的时间,至少要等我升本之后…

LarkXR上新了 | Apollo多终端与XR体验的优化创新

作为领先的数字平行世界产品技术提供方,「Paraverse平行云」一直致力于为企业和开发者提供企业级实时云渲染解决方案。其多终端接入产品LarkXR Apollo,基于底层Runtime技术,实现了在Windows、Linux、MacOS、Android、iOS等多种操作系统下&…

机器硬件命令

一、查看机器核数 有以下几种方法 1、lscpu命令 lscpu命令可以显示关于CPU的信息,包括核数、线程数等。在终端中输入以下命令即可查看CPU核数:该命令会输出CPU每个物理插槽的核数。 lscpu | grep "Core(s) per socket" | awk {print $NF} …

[iOS]高版本MacOS运行低版本Xcode

Xcode 版本支持文档 目的: 在MacOS Sonoma 系统上安装 Xcode14.3.1 第一步 先在Xcode下载一个Xcode14.3.1的压缩包 第二步 本地解压Xcode,将外层目录名变更为Xcode_14.3.1,将文件拷贝到 /Applications目录下。 第三步 变更xcode-sel…

案例分析篇06:数据库设计相关28个考点(17~22)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

中国金融统计年鉴、中国保险统计年鉴、中国人口与就业统计年鉴、国民经济和社会发展公报、中国劳动统计年鉴

数据下载链接:百度云下载链接 统计年鉴是指以统计图表和分析说明为主,通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年…

案例分析篇01:软件架构设计考点架构风格及质量属性(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

JavaScript数组排序sort自定义函数不生效

背景 刷LeetCode时,遇到一道简单的数组排序题: 问题 想着直接用js的数组sort自定义排序即可,奈何测试用例运行总是不通过,返回的一直都是原数组。 代码排查 复制代码到Firefox浏览器控制台运行,结果输出的是正确结果&a…

【矩阵】240. 搜索二维矩阵 II【中等】

搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22…

Python爬虫实战入门:豆瓣电影Top250(保你会,不会来打我)

文章目录 需求所需第三方库requests模块lxml模块了解 lxml模块和xpath语法xpath语法-基础节点选择语法 实战教程完整代码 需求 目标网站: https://movie.douban.com/top250 需求: 爬取电影中文名、英文名、电影详情页链接、导演、主演、上映年份、国籍、类型、评分、评分人数, …

StarRocks——滴滴的极速多维分析实践

背景 滴滴集团作为生活服务领域的头部企业,其中橙心优选经过一年多的数据体系建设,逐渐将一部分需要实时交互查询,即席查询的多维数据分析需求由ClickHouse迁移到了StarRocks中,接下来以StarRocks实现的漏斗分析为例介绍StarRocks…

扫雷小游戏制作教程:用HTML5和JavaScript打造经典游戏

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…