当前位置: 首页 > news >正文

spring之AOP简介

1.AOP简介

  • 什么是AOP

    • Aspect Oriented Program面向切面编程
    • 在不改变原有逻辑上增加额外的功能,比如解决系统层面的问题,或者增加新的功能
  • 场景

    • 权限控制
    • 缓存
    • 日志处理
    • 事务控制
  • AOP思想把功能分两个部分,分离系统中的各种关注点

    • 核心关注点:业务的主要功能
    • 横切关注点:非核心、额外增加的功能
  • 好处

    • 减少代码侵入、解耦
    • 可以统一处理横切逻辑
    • 方便添加和删除横切逻辑

2.AOP名词解释

  • 横切关注点
    • 对哪些方法进行拦截,拦截后怎么处理,这些就叫横切关注点
    • 比如权限认证、日志、事务
  • 通知Advice
    • 在特定的切入点上执行的增强处理,有5种通知
    • 比如你需要记录日志、控制事务,提前编写好通用的模块,需要的地方直接调用
  • 连接点JoinPoint
    • 要用通知的地方,业务流程在运行过程中需要插入切面的具体位置
    • 一般是方法的调用前后,全部方法都可以是连接点
    • 只是概念,没啥特殊
  • 切入点Pointcut
    • 不能全部方法都是连接点,通过特定的规则来筛选连接点,就是Pointcut,选中哪几个你想要的方法
    • 在程序中主要体现为书写切入点表达式(通过通配、正则表达式)过滤出特定的一组JoinPoint连接点
    • 过滤出响应的Advice将要发生的JoinPoint地方
  • 切面Aspect
    • 通常是一个类,里面定义切入点+通知,定义在什么地方、什么时间点、做什么事情
    • 通知Advice指明了时间和做的事情(前置、后置等)
    • 切入点Pointcut指定在什么地方干这个事情
    • web接口设计中,web层–>网关层–>服务层–>数据层,每一层之间也是一个切面,对象和对象、方法和方法之间都是一个个切面
  • 目标target
    • 目标类,真正的业务逻辑,可以在目标类不知情的条件下增加新的功能到目标类的链路上
  • 织入Weaving
    • 把切面(某个类)应用到目标函数的过程称为织入
  • AOP代理
    • AOP框架创建的对象,代理就是目标对象的加强
    • spring中的AOP代理可以是JDK动态代理,也可以是CGLiB代理

3.通知Advice类型

  • @Before前置通知:在执行目标方法之前运行

  • @After后置通知:在目标方法运行结束之后

  • @AfterReturning返回通知:在目标方法正常返回值后运行

  • @AfterThrowing异常通知:在目标方法出现异常后运行

  • @Around环绕通知:在目标方法完成前、后做增强处理,环绕通知是最重要的通知类型,像事务、日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint,需要手动执行joinPoint.proceed()

4.切入点表达式

  • 切入点表达式

    • 除了返回类型、方法名和参数外,其它项都是可选的(修饰符基本都是省略不写)
      execution(访问修饰符 返回值类型 包和类方法 (..))
      @Pointcut("execution(public * com.gen..*.* (..))")
      
  • 常见匹配语法

    • *:匹配任何数量字符,单个

    • …:匹配任何数量字符,可以多个;在类型模式中匹配任何数量子包,在方法参数模式中匹配任何数量参数

      ()匹配无参的方法
      (..)匹配任意参数的方法
      (*)匹配只接收一个任何类型参数的方法
      (*, Integer)匹配接收两个参数的方法,其中第一个参数是任意类型,第二个参数必须是Integer类型
      

5.简单代码示例

package com.gen;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;/*** 日志切面类*/
@Component
@Aspect
public class LogAspect {/*** 切入点*/@Pointcut("execution(public * com.gen..*.* (..))")public void pointCut() {}@Around("pointCut()")public void log(ProceedingJoinPoint joinPoint) {System.out.println("日志记录==>" + joinPoint.getSignature().getName());try {joinPoint.proceed();} catch (Throwable e) {throw new RuntimeException(e);}}
}

相关文章:

spring之AOP简介

1.AOP简介 什么是AOP Aspect Oriented Program面向切面编程在不改变原有逻辑上增加额外的功能,比如解决系统层面的问题,或者增加新的功能 场景 权限控制缓存日志处理事务控制 AOP思想把功能分两个部分,分离系统中的各种关注点 核心关注点&a…...

ros::init用途用法

文章目录 用途:用法:ros::init 是 ROS(Robot Operating System)中的一个重要函数,它用于初始化 ROS 节点。在启动任何 ROS 节点之前,都必须首先调用这个函数。以下是其用途和基本用法。 用途: 节点初始化:为ROS系统中的节点进行初始化。一个节点是ROS计算图中的一个可…...

逻辑回归的含义

参考:线性回归 & 逻辑回归 问题 1、线性回归(Linear Regression)和逻辑回归(Logistic Regression)有什么联系? 2、逻辑回归的“逻辑”、“回归是什么意思”? 回答1 线性回归假设因变量…...

解决Apache Tomcat “Request header is too large“ 异常 ‍

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

腾讯音乐如何基于大模型 + OLAP 构建智能数据服务平台

本文导读: 当前,大语言模型的应用正在全球范围内引发新一轮的技术革命与商业浪潮。腾讯音乐作为中国领先在线音乐娱乐平台,利用庞大用户群与多元场景的优势,持续探索大模型赛道的多元应用。本文将详细介绍腾讯音乐如何基于 Apach…...

Java 16进制字符串转换成GBK字符串

问题: 现在已知有一个16进制字符串 435550D3C3D3DAD4DABDBBD2D7CFECD3A6CFFBCFA2D6D0B4E6B7C5D5DBBFDBD0C5CFA2A3ACD5DBBFDBBDF0B6EE3130302E3036 而且知道这串的字符串对应的内容是: CUP用于在交易响应消息中存放折扣信息,折扣金额100.06 但…...

【ES6】JavaScript中的Symbol

Symbol是JavaScript中的一种特殊的、不可变的、不可枚举的数据类型。它通常用于表示一个唯一的标识符,可以作为对象的属性键,确保对象的属性键的唯一性和不可变性。 Symbol.for()是Symbol的一个方法,它用于创建一个已经注册的Symbol对象。当…...

理解React页面渲染原理,如何优化React性能?

React JSX转换成真实DOM过程 当使用React编写应用程序时,可以使用JSX语法来描述用户界面的结构。JSX是一种类似于HTML的语法,但实际上它是一种JavaScript的扩展,用于定义React元素。React元素描述了我们想要在界面上看到的内容和结构。 在运…...

数据通信——传输层TCP(可靠传输机制的滑动窗口)

引言 之前提到过拥塞问题,如果大量数据疯狂涌入,接收端无法及时处理就会导致数据丢包,从而使得通信受到干扰。之前的连续ARQ如果不加以节制,疯狂发送报文,接收端无法及时返回ACK就会导致网络瘫痪。 滑动窗口机制协议 这…...

Mycat之前世今生

如果我有一个32核心的服务器,我就可以实现1个亿的数据分片,我有32核心的服务器么?没有,所以我至今无法实现1个亿的数据分片。——MyCAT ‘s Plan 话说“每一个成功的男人背后都有一个女人”,自然MyCAT也逃脱不了这个诅…...

Linux- 重定向标准输出(stdout)和标准错误(stderr)

在Linux或Unix系统中,可以通过重定向标准输出(stdout)和标准错误(stderr)来将脚本的输出保存到一个文件中。以下是一些方法: 只重定向标准输出到文件: ./your_script.sh > output.txt这将只捕…...

PostgreSQL分区表

什么是分区表 数据库分区表将表数据分成更小的物理分片,以此提高性能、可用性、易管理性。分区表是关系型数据库中比较常见的对大表的优化方式,数据库管理系统一般都提供了分区管理,而业务可以直接访问分区表而不需要调整业务架构&#xff0c…...

android framework之Applicataion启动流程分析(二)

上一篇讲了Zygote是如何收到启动Application的启动消息,并一步步进入Fork(),下面来分析zygote fork启动application后,application进程后续处理操作,是如何真正的启动的。 ZygoteInit.main():-->...caller ZygoteServer.runSelectLoop()…...

django静态文件无法访问解决方案

nginx配置如下: # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/user nginx; worker_processes auto; error_log /var/log/ng…...

WIndows 配置多版本python环境,非常清晰明了

配置多个python环境 下面以配置三个python版本环境为例子 首先下载好三个环境的python,如:python2.7、python3.6、python3.10 给个官网链接自己下,想要几版本就下几:https://www.python.org/downloads/windows/ 下载完成后将pyth…...

Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

目录 1267. 统计参与通信的服务器 题目描述: 实现代码与解析: 写法一:两次遍历 hash 原理思路: 写法二:三次遍历 原理思路: 1267. 统计参与通信的服务器 题目描述: 这里有一幅服务器分…...

c++(8.28)菱形继承,虚继承,多态,抽象类,模板+Xmind

xmind: 作业: 1.编程题: 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴…...

安装部署JavaFX和IDEA添加JavaFX的详细步骤

安装部署JavaFX和IDEA添加JavaFX的详细步骤 一、认识JavaFX二、下载JavaFX三、解压到目录下四、IDEA导入JavaFX五、添加JavaFX的VM选项六、运行命令七、总结一、认识JavaFX JavaFX是Java平台的一个图形用户界面(GUI)工具包,用于创建丰富、交互式和可视化的应用程序。JavaFX提…...

MAC电脑外放没有声音解决方案

烦人呐,我的mac外接显示屏幕,显示器没有音频输出,需要mac笔记本的音频输出,但是经常打开后,mac没有声音输出,需要重启电脑才能生效。亲测一下方法有效,请参考: 文章目录 一、短期方案…...

Spring源码分析(八)CreateBean与DoCreateBean

写目录 一 CreateBean二 doCreateBean2.1 BeanWrapper2.2 缓存删除2.3 实例化Bean2.3.1 Supplier创建对象2.3.2 工厂创建对象2.3.3 构造器创建实例无参构造构造器依赖注入Setter的依赖注入autowireConstructor实例化instantiateBean 方法 2.4 Bean的前置处理 官网:H…...

s2-proGPU部署方案:多模型共存时s2-pro显存隔离与QoS保障策略

s2-proGPU部署方案:多模型共存时s2-pro显存隔离与QoS保障策略 1. 引言 在GPU服务器上同时运行多个AI模型已成为常态,但这也带来了显存资源竞争和性能波动的问题。本文将详细介绍如何在多模型共存环境下,为s2-pro语音合成模型实现显存隔离与…...

Graphormer企业级应用:制药公司分子筛选流水线中的轻量部署实践

Graphormer企业级应用:制药公司分子筛选流水线中的轻量部署实践 1. 项目背景与价值 在药物研发领域,分子筛选是耗时耗力的关键环节。传统实验方法需要数月时间才能完成数千种化合物的性质测试,而基于AI的分子属性预测技术可以将这一过程缩短…...

RWKV7-1.5B-g1a效果展示:‘请用一句中文介绍你自己’真实响应

RWKV7-1.5B-g1a效果展示:请用一句中文介绍你自己真实响应 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构开发的多语言文本生成模型,特别适合中文场景下的轻量级对话和文本生成任务。这个1.5B参数的版本在保持响应速度的同时,提供了…...

大数据-253 离线数仓 - Airflow 入门与任务调度实战:DAG、Operator、Executor 部署排错指南

TL;DR 场景:面向离线数仓与定时任务场景,快速理解 Airflow 的核心概念、DAG 编排方式与基础命令。结论:本文内容适合作为 Airflow 入门示例,但代码与命令明显偏旧,需区分 Airflow 1.x 与 2.x 版本差异。产出&#xff…...

TextGrad部署与性能优化:生产环境最佳实践

TextGrad部署与性能优化:生产环境最佳实践 【免费下载链接】textgrad Automatic Differentiation via Text -- using large language models to backpropagate textual gradients. 项目地址: https://gitcode.com/gh_mirrors/te/textgrad TextGrad是一款基于…...

Qt 实时数据可视化工程实践:环形缓冲区实践

目录 前言 一、架构设计 1.1 分层架构图 1.2 数据写入流 1.3 数据刷新流 (定时器驱动 → 视图更新) 1.4 核心设计思想 二、核心实现详解 2.1 RingBuffer:环形缓冲区实现 2.1.1 append函数(线程安全写入) 函数主体实现: …...

Arduino轻量级协作式任务调度库Jobber详解

1. Jobber库概述:面向Arduino的轻量级协作式任务调度框架Jobber是一个专为资源受限嵌入式平台(尤其是Arduino系列MCU)设计的协作式任务调度库,其核心目标是提供一种“模拟多线程”的编程模型,使开发者能够以接近线程的…...

PyMobileDevice3 高效异步架构解析:深入理解iOS设备通信协议栈实现

PyMobileDevice3 高效异步架构解析:深入理解iOS设备通信协议栈实现 【免费下载链接】pymobiledevice3 Pure python3 implementation for working with iDevices (iPhone, etc...). 项目地址: https://gitcode.com/gh_mirrors/py/pymobiledevice3 PyMobileDev…...

Typora搭配PicGo实现Markdown图片自动上传到Gitee的保姆级教程

Typora与PicGo联动:打造Gitee图床自动化工作流 对于长期使用Markdown写作的技术博主和文档工程师来说,图片管理始终是个痛点。本地图片导致文档迁移困难,第三方图床存在失效风险,而手动上传又严重打断创作流程。这套基于TyporaPic…...

避坑指南:Silvaco TCAD光电仿真中,均匀光与高斯光设置对结果影响的深度解析

避坑指南:Silvaco TCAD光电仿真中均匀光与高斯光设置的深度解析 在光电探测器仿真领域,光源模型的精确设置往往是被忽视却至关重要的环节。许多工程师花费大量时间优化器件结构和材料参数,却在光源设置环节草率处理,导致仿真结果与…...