Spring AOP(面向切面编程)

news2024/12/23 23:04:24

1.Spring AOP 简介

1.1 AOP概述

AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程, 是通过预编译方式运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

1.2 AOP 的作用及其优势

作用 : 在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势 : 减少重复代码,提高开发效率,并且便于维护

1.3 AOP 的底层实现

AOP 底层是通过 Spring 提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态生成代理对象,代理对象方法执行时进行增强功能的介入,再去调用目标对象的方法,从而完成功能的增强。

1.4 AOP 动态代理技术

常用的动态代理技术:

  • JDK 代理 : 基于接口的动态代理技术
  • cglib 代理 : 基于父类的动态代理技术
    在这里插入图片描述

1.5 JDK 动态代理技术

    1. 目标类接口
      在这里插入图片描述
    1. 目标类
      在这里插入图片描述
    1. 动态代理代码
      在这里插入图片描述
    1. 调用代理对象方法测试
      在这里插入图片描述

1.6 cglib 动态代理技术

    1. 目标类
      在这里插入图片描述
    1. 动态代理代码
      在这里插入图片描述
    1. 调用代理对象方法测试
      在这里插入图片描述

1.7 AOP 相关概念

Spring AOP 实现底层就是对动态代理代码进行封装,封装后我们只需要对需要关注的部分进行代码编
写,并通过配置的方式完成指定目标的方法增强。

AOP相关术语:

  • Target(目标对象) : 代理的目标对象
  • Proxy(代理) : 一个类被 AOP 织入增强后,就产生一个结果代理类
  • Joinpoint (连接点) : 所谓连接点指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
  • Pointcut(切入点) : 所谓切入点指我们要对哪些Joinpoint 进行拦截定义
  • Advice(通知/增强) : 所谓通知指拦截到 Joinpoint 之后所要做的事情
  • Aspect(切面) : 切面是切入点和通知(引介)的结合
  • Weaving(织入) : 织入指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而Aspect采用编译期织入和类装载期织入

1.8 AOP 开发明确事项

  1. 需要编写的内容
  • 编写核心业务代码(目标类的目标方法)
  • 编写切面类,切面类中有通知(增强功能方法)
  • 在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
  1. AOP 技术实现的内容
    Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象对应位置将通知对应的功能织入,完成完整代码的逻辑运行。

  2. AOP 底层使用哪种代理方式
    在 spring 中,框架会根据目标类是否实现接口来决定采用哪种动态代理的方式。

在这里插入图片描述

2. 基于 XML 的 AOP 开发

2.1 快速入门

    1. 导入 AOP 相关坐标
      在这里插入图片描述
    1. 创建目标接口和目标类(内部有切点)
      在这里插入图片描述
    1. 创建切面类(内部有增强方法)
      在这里插入图片描述
    1. 将目标类和切面类的对象创建权交给 spring
      在这里插入图片描述
    1. 在applicationContext.xml 中配置织入关系
      5.1 导入aop命名空间:
      在这里插入图片描述
      5.2 配置切点表达式和前置增强的织入关系:
      在这里插入图片描述
    1. 测试代码
      在这里插入图片描述

2.2 AOP – XML 配置详解

    1. 切点表达式写法
表达式语法: execution([修饰符] 返回值类型 包名.类名.方法名(参数))
  • 访问修饰符可以省略
  • 返回值类型、包名、类名、方法名可以使用星号*代表任意
  • 包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
  • 参数列表可以使用两个点…表示任意个数,任意类型的参数列表

在这里插入图片描述

    1. 通知类型
通知的配置语法: <aop:通知类型 method=“切面类中方法名” pointcut=“切点表达式"></aop:通知类型>

在这里插入图片描述

    1. 切点表达式抽取
      当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用 pointcut-ref属性代替 pointcut 属性来引用抽取后的切点表达式。
      在这里插入图片描述

3. 基于注解的 AOP 开发

3.1 快速入门

    1. 创建目标接口和目标类(内部有切点)
      在这里插入图片描述
    1. 创建切面类(内部有增强方法)
      在这里插入图片描述
    1. 将目标类和切面类的对象创建权交给 spring
      在这里插入图片描述
    1. 在切面类中使用注解配置织入关系
      在这里插入图片描述
    1. 在配置文件中开启组件扫描和 AOP 自动代理
      在这里插入图片描述
    1. 测试代码
      在这里插入图片描述

3.2 AOP – 注解配置详解

    1. 通知类型
通知配置语法 : @通知注解(“切点表达式")

在这里插入图片描述

    1. 切点表达式抽取
      抽取方式是在切面内定义方法,在该方法上使用 @Pointcut 注解定义切点表达式,然后在在增强注解中进行引用。
      在这里插入图片描述

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

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

相关文章

亚信安全数据安全运营平台DSOP新版本发布 注入AI研判升维

在当今快速发展的数字经济时代&#xff0c;企业对于数据的依赖日益加深&#xff0c;数据安全已成为企业的生命线。亚信安全推出数据安全运营平台DSOP全新版本&#xff0c;正是为满足企业对数据安全的高度需求而设计。这款平台以其卓越的能力和技术优势&#xff0c;为企业的数据…

链表基础4——带头双向循环链表

什么是带头双向循环链表 我们直接看图片 定义结点类型 typedef int LTDataType;//存储的数据类型typedef struct ListNode {LTDataType data;//数据域struct ListNode* prev;//前驱指针struct ListNode* next;//后继指针 }ListNode;链表的初始化 //创建一个新结点 ListNod…

Java 非对称加密RSA应用实现

1.RSA介绍 RSA算法是一种非对称加密算法&#xff0c;与对称加密算法不同的是,RSA算法有两个不同的密钥&#xff0c;一个是公钥&#xff0c;一个是私钥。 RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥&#xff0c;“由已知加密密钥推导出解密密钥在计算上是不可行的…

王者荣耀快速提升等级

1、为什么要提升等级 等级越高&#xff0c;解锁的玩法越多 等级越高&#xff0c;解锁的铭文数量越多&#xff0c;铭文能提升英雄的技能属性 2、如何快速提升等级 通过快速赛、排位赛、人机赛等均可以获取经验值 通过经验翻倍卡&#xff0c;可以快速获取经验值 3、经验卡翻倍…

YOLOv8水稻病害检测系统(python代码,可以通过图片、视频或者摄像头三种路径进行检测)

1.效果视频&#xff1a;最新最全面的水稻病害检测创作&#xff08;yolov8模型&#xff0c;稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫等病害。&#xff09;_哔哩哔哩_bilibili 2.数据集介绍 水稻叶病害数据集&#xff08;目标检测&#xff0c;yolo…

信道的题目

调制信道分为恒参信道和随参信道。恒参信道举例&#xff1a;各种有线信道&#xff1b;中长波地波传播、卫星中继。随参信道举例&#xff1a;短波电离层反射信道、各种散射信道、移动通信信道。狭义信道分为有线信道和无线信道。广义信道包含调制信道和编码信道。调制信道中不包…

RK3568 android11 修改关机弹窗界面

需要修改关机弹窗界面&#xff0c;当前界面我已经按照客户需求去掉emergency 但是客户需要按其他区域可以实现返回&#xff0c;也就是点击黑色背景取消dialog 嗑代码发现黑色布局为&#xff1a; <node index"0" text"" resource-id"com.android.…

【R语言】混合图:小提琴图+箱线图

{ggstatsplot} 是 {ggplot2} 包的扩展&#xff0c;用于创建图形&#xff0c;其中包含信息丰富的绘图本身中包含的统计测试的详细信息。在典型的探索性数据分析工作流程中&#xff0c;数据可视化和统计建模是两个不同的阶段&#xff1a;可视化通知建模&#xff0c;而建模又可以建…

janus架构学习

基础介绍 Janus 是由Meetecho设计和开发的开源、通用的基于SFU架构的WebRTC流媒体服务器&#xff0c;它支持在Linux的服务器或MacOS上的机器进行编译和安装。Janus 是使用C语言进行编写的&#xff0c;它的性能十分优秀。 架构 janus为sfu架构 模块结构图 模块说明 core模…

C# Solidworks二次开发:获取模型、组件、主体的表面积相关API详解

大家好&#xff0c;今天要介绍模型、组件、主体的表面积相关API。 下面是今天要介绍的API: &#xff08;1&#xff09;第一个为SurfaceArea Property (IMassProperty)&#xff0c;这个API的含义为获取此模型的表面积&#xff0c;下面是官方的具体解释&#xff1a; 其没有输入…

如何解决DDoS攻击?群联科技做出回答。

DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种恶意利用多台傀儡机协同发起大规模网络流量&#xff0c;旨在压垮目标系统或网络资源&#xff0c;使其无法正常服务的网络攻击手段。由于现代计算机和网络性能的提升&#xff0c;单点发起的DoS攻击已难以奏效&#xff…

UML 介绍

前言 UML 简介。 文章目录 前言一、简介1、事务2、关系1&#xff09;依赖2&#xff09;关联聚合组合 3&#xff09;泛化4&#xff09;实现 二、类图三、对象图四、用例图五、交互图1、序列图&#xff08;顺序图&#xff09;2、通信图 六、状态图七、活动图八、构件图&#xff0…

探索设计模式的魅力:开启智慧之旅,AI与机器学习驱动的微服务设计模式探索

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索AI与机器学习驱动的微服务设计模式之旅✨ 亲爱的科技爱好者们&#xff0c;有没…

C#语法知识之运算符

3、运算符 目录 3、运算符1、算数运算符思考 秒转化时间 2、字符串拼接3、条件运算符4、逻辑运算符5、位运算符6、三目运算符思考 闰年 1、算数运算符 1、赋值符号 //把右侧的值赋给左侧的变量2、算数运算符 _ * / float f 1 / 2f; %3、算数运算符的优先级 //乘除余优先级高…

Python可视化数据分析-饼状图

一、前言 饼状图&#xff08;Pie Chart&#xff09;是一种常用的数据可视化图表&#xff0c;用于展示数据中各部分的占比关系。Python 中有多种库可以用于绘制饼状图&#xff0c;比较常用的包括 matplotlib、pyecharts和 plotly 等。 二、使用 matplotlib 绘制饼状图 import…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

MySQL-实验-单表、多表数据查询和嵌套查询

目录 0.简单子查询 &#xff08;1&#xff09;带比较运算符的子查询 &#xff08;2&#xff09;关键字子查询 1.多表查询 3.子查询 4.多表子查询 0.简单子查询 &#xff08;1&#xff09;带比较运算符的子查询 在右侧编辑器补充代码&#xff0c;查询大于所有平均年龄的员…

镜像仓库registory中的秘钥管理

镜像仓库中的秘钥管理 1 生成密钥 在使用私有镜像拉取镜像时&#xff0c;需要为私有镜像仓库创建一个镜像仓库的密钥&#xff0c;并在创建容器中进行引用。创建镜像仓库的语法和格式&#xff1a; kubectl create secret docker–registry <regsecret-name> —docker–…

C/C++程序设计实验报告4 | 函数实验

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

kali下设置root权限(包含很多技巧)

默认是没有密码的&#xff0c;后期使用超级管理员root操作kali系统&#xff0c;我们需要设置 Ctrlshift再加上“”号可以调节字体大小 此时提示符为#