面向切面编程的一些概念

news2025/1/18 6:05:25

横切关注点

  • 散播应用中多处的功能被称为横切关注点

    • 安全就是一个关注点,每个方法或者类都需要注重安全
    • 方法参数日志记录也是一个关注点
    • 以及事务管理
  • 横切关注点从概念上讲是与业务分离的,但往往会直接嵌入到业务中

    • 多个类使用到相同的功能。最常见到的就是继承或委托

    • 为什么不使用继承

      如果整个应用都使用相同的基类,会导致脆弱的对象体系

    • 为什么不使用委托

      可能需要对委托对象进行复杂的调用

  • 把横切关注点与业务分离是面向切面编程(AOP)要解决的重要问题

切面

  1. 横切点可以被模块化为特殊的类,这个类被称为切面
  2. 取代继承和委托的另一种方案
  3. 一处定义功能,生声明何时何地使用

术语

AOP 已经形成了自己的术语,常见的有 1. 通知 2. 切点 3. 连接点

通知 Advice

  • 切面要完成的工作被称为通知,它定义了切面要做什么,何时使用

  • 何时使用

    • 前置通知 Before

      • 在目标方法被调用之前调用通知功能
    • 后置通知 After

      • 在目标方法完成之后调用通知,不会关心方法输出是什么,也不会关心是否执行成功
    • 返回通知 After-returning

      • 在目标方法成功执行之后调用通知
    • 异常通知 After-throwing

      • 在目标方法抛出异常后调用通知
    • 环绕通知 Around

      • 包裹被通知的方法:目标方法调用之前之后都要执行

连接点 JoinPoint

  • 触发通知的时机叫做连接点

    • 调用方法时
    • 抛出异常时
    • 修改字段时

切点 PointCut

  • 要执行通知的地点,指明了哪些方法要执行切面。
  • 通常使用明确的类或方法名称或正则表达式匹配类或方法名指定切点

切面 Aspect

  • 切面是通知和切点的结合,它是什么,何时 何地完成其功能

引入 Introduction

  • 可以在现有的类中添加新的方法和属性

织入 Weaving

  • 把切面应用到目标对象并创建新的代理对象的过程。

  • 织入可以在多个时期发生:

    • 编译期

      • 切面在目标类编译期被织入,需要特殊的编译器
    • 类加载期

      • 切面在目标类加载到JVM时被织入,需要特殊的类加载器。他可以在目标类被引入到应用之前增强该目标类的字节码
    • 运行期

      • 切面在应用运行的某时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象,SpringAOP就是以这种方式织入切面的

Spring对AOP的支持

Spring 提供了4种类型的AOP支持

  • 基于代理的经典AOP

    • 不用,过于笨重和复杂
  • 纯POJO切面

    • 不怎么用,需要XML配置
  • @AspectJ注解驱动切面

    • 用的多
  • 注入式 AspectJ切面,适用Spring各种版本

Spring 只支持方法级别的连接点

  • 因为Spring 基于动态代理实现的AOP

  • Spring 不支持对字段和构造器连接点

    • 不可以拦截对象字段的修改
    • 无法在bean创建时拦截
  • AspectJ 和 JBoss 除了方法切点,还支持字段和构造器

编写切面

SpringAOP 仅支持部分Aspect指示器

  • Spring AOP 支持的指示器:
    • arg()
      限制连接点的匹配参数为为指定类型的执行方法

    • @args()
      限制连接点匹配参数由指定注解标注的执行方法

    • execution()
      用于匹配是连接点的执行方法

    • this()
      限制连接点匹配 AOP代理的bean引用为指定类型的类

    • target
      限制连接点匹配目标对象为指定类型的类

    • @target()
      限制连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解

    • within()
      限制连接点匹配指定的类型

    • @within()
      限制连接点匹配注解所标注的类型

    • @annotation
      限定匹配 带有指定注解的连接点

    • bean()
      限定beanId

当在Spring 中使用其他指示器时,会抛出异常
只有 execution 指示器是实际执行匹配的,其他都是限制匹配的

切入点的编写规则

  • 示例:
  • 与 within() 配合
  • 在切点中选择bean

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

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

相关文章

【C++面向对象程序设计】CH5 继承与派生

目录 前言 一、继承与派生的概念 二、派生类的声明方式 1.格式 2.【例】假定已经声明一个基类student,在它基础上通过单继承建立一个派生类student1。 三、派生类的构成 四、派生类成员的访问属性 前言 1.公有继承 (1)公有基类在派…

r、 weka从决策树模型看员工为什么离职?

马云说:“员工离职的原因总是只有两个:钱,没有到位;心委屈了。” 现在很多老板都抱怨说,年轻人的流动率太高了,员工觉得老板的钱太少了,最后还是多指责。 最近我们被客户要求撰写关于员工离职的研究报告&…

黄佳《零基础学机器学习》chap2笔记

黄佳 《零基础学机器学习》 chap2笔记 第2课 数学和Python基础知识 文章目录黄佳 《零基础学机器学习》 chap2笔记第2课 数学和Python基础知识2.1 函数描述了事物间的关系机器学习中常用的一些函数2.2 捕捉函数的变化趋势2.3 梯度下降2.4 机器学习的数据结构--张量2.4.1 张量的…

Mysql5.7 基于Docker搭建主从复制集群

基础 参考:mysql5.7-Docker-安装-备份 拉取镜像 docker pull mysql:5.7 创建目录 mkdir /home/liangshijie/mysql-docker-file/conf mkdir /home/liangshijie/mysql-docker-file/logs mkdir /home/liangshijie/mysql-docker-file/data创建配置文件 cd /home…

GEE Python本地快速下载GEE数据(比网页版保存到网盘再下载快几十倍,尤其是在下载几十年的长时间系列数据时,速度提升更加明显)

前言 可根据研究区直接裁剪数据以及进行一些计算处理后再下载,GEE成为了大家下载数据的重要途径,然而直接通过官网网页将数据先保存到网盘再下载的下载方法速度太慢,新号速度还好,越用速度越来越慢,本文提供了一种直接…

IBM MQ通道接收端绑定步骤

不同类型的绑定 IBM MQ 支持应用程序可以连接的两种方式: 1.本地绑定:这是当应用程序和队列管理器在同一个操作映像上时。 CHLAUTH 与此类应用程序连接无关。 2. 客户端绑定:这是应用程序和队列管理器使用网络进行通信的时候。 应用程序和队列…

从Opencv之图像直方图源码,探讨高性能计算设计思想

前言 纸上得来终觉浅,绝知此事要躬行。学会算法的理论很重要,但是把理论高效的实现也是需要一点点练习的。 图像直方图的理论很简单,就是把一个图像的像素区间划分为几个子区间,然后统计图像中的像素包含在子区间内的个数。这里&a…

什么是网络变压器,它是干什么用的?作用/参数表/价格及型号体系有哪些?怎么测量网络变压器好坏

什么是网络变压器? 网络变压器是在以太网网络传输设备中,主板上芯片PHY与网口RJ45之间的一个黑黑的小方块,里面的结构是磁环及铜线组成,这个小方块就是我们俗称的网络变压器 有的变压器中心抽头接到地。而接电源时,电…

深度学习入门(五十七)循环神经网络——循环神经网络从零开始实现

深度学习入门(五十七)循环神经网络——循环神经网络从零开始实现前言循环神经网络——循环神经网络从零开始实现教材1 独热编码(one-hot)2 初始化模型参数3 循环神经网络模型4 预测5 梯度裁剪6 训练7 小结前言 核心内容来自博客链接1博客连接2希望大家多…

【Hack The Box】linux练习-- Pandora

HTB 学习笔记 【Hack The Box】linux练习-- Pandora 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x1f…

TensorFlow之文本分类算法-4

1 前言 2 收集数据 3 探索数据 4 选择模型 5 准备数据 6 模型-构建训练评估 机器学习主要包括模型构建、模型训练、模型评估,在选择模型章节中已经对如何根据S/W的比率进行模型的选择,其包括n-gram模型或者序列模型,本章节内容主要描述…

LeetCode-813-最大平均值和的分组

1、动态规划法 我们可以利用数组dp[i][j]dp[i][j]dp[i][j]来表示我们将数组中区间[0,i−1][0,i-1][0,i−1]的元素分为jjj组的平均值的总和。因此我们可以得到状态转化方程如下:{dp[i][j]∑r0i−1nums[r]i,j1dp[i][j]maxx≥j−1(dp[x][j−1]∑rxi−1nums[r]i−x),j&…

计算机五大部件是指什么

计算机五大部件: 计算机硬件系统由运算器、控制器、存储器(内外存储器)、输入设备和输出设备五部分组成。 1、控制器:控制器就是一个系统中枢,控制计算机如何运行、运转的基本单元。 每一个运算器都需一个单独的控制…

D-016 JTAG硬件电路设计

JTAG硬件电路设计1 简介1.1 JTAG分类1.2 ARM调试器2 设计要点3 电路实战3.1 Xilinx3.2 ALTERA ------USB blaster1 简介 JTAG(Join Test Action Group)的中文名称为联合测试工作组,是一种国际标准测试协议,主要用于芯片内部测试:验证设计和P…

Ubuntu16.04 完整版 Gym 安装及说明

Ubuntu16.04 完整版 Gym 安装及说明1. 安装前言2. Gym 开发环境说明3. 完整版 Gym 的安装3.1 Anaconda 创建虚拟环境3.2 安装 gym[box2d]3.2.1 采用官方 GitHub 教程进行安装的报错及解决方案3.2.2 采用 Anaconda 进行安装3.2.3 测试能否成功运行 LunarLander-v2 环境3.3 安装 …

【一文秒懂——YAML配置文件】

目录 1. YAML配置文件 2. 实例 2.1 将原application.properties改为application.yml: 2.2 将原application-dev.properties改为application-dev.yml: 1. YAML配置文件 在Spring Boot项目中,还可以使用YAML配置文件,这是一种使…

一文搞懂漏洞严重程度分析

漏洞的级别定义主要从两个维度进行判断; 1、可利用性 2、影响性 可利用性指标 可利用性指标组刻画脆弱性组件(即包含漏洞的事物)的特征,反映漏洞利用的难易程度和技术要求等。可利用性指标组包含四个指标,分别是攻击…

最新阿里云GPU服务器租用配置费用价格表出炉(多配置报价)

阿里云GPU服务器优惠3折GPU云服务器vgn6i优惠价469.46元/月起,GPU云服务器gn6i和GPU云服务器gn6v均有活动,NVIDIA T4及V100均有活动,主机教程网 来详细说下阿里云GPU云服务器收费标准价格表,再来说说GPU云服务器计费模式&#xff…

Python学习笔记(十八)——Pandas进阶

文章主要内容文件操作: • 文件读取: read_csv(csv),read_table(表格),read_excl(excel) • 文件写入:to_csv, to_excel 数据清洗: • 处理缺失值:isnull(识别), dropna (过滤), fillna(填充) • 数据转换:drop_duplic…

MVCC多版本并发控制

目录 1、数据库并发场景 2、当前读和快照读 3、MVCC的隔离级别 4、实现原理 4.1、隐藏字段 ​​​​​​​4.2、Undo_log(版本链) 4.3、Read View(读视图) 4.4、RC、RR隔离级别下的快照读有什么区别 MVCC,多版…