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);}}
}

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

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

相关文章

python爬虫数据解析xpath

一、环境配置 1、安装xpath 下载地址:百度网盘 请输入提取码 第一步: 下载好文件后会得到一个没有扩展名的文件,重命名该文件将其改为.rar或者.zip等压缩文件,解压之后会得到一个.crx文件和一个.pem文件。新建一个文件夹&…

《论文阅读21》Equivariant Multi-View Networks

一、论文 研究领域:计算机视觉 | 多视角数据处理中实现等变性论文:Equivariant Multi-View Networks ICCV 2019 论文链接视频链接 二、论文简述 在计算机视觉中,模型在不同视角下对数据(例如,点云、图像等&#xff0…

【python爬虫】—豆瓣电影Top250

豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片,涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影&#xff…

【Python 自动化】自媒体剪辑第一版·思路简述与技术方案

大家都知道我主业是个运维开发(或者算法工程师),每天时间不多,但我又想做自媒体。然后呢,我就想了个方案,每天起来之后写个短视频的脚本,包含一系列图片和文字,然后上班的时候给它提…

AMEYA360代理 | 佰维eMMC、LPDDR存储芯片赋能电视终端流畅体验

5G、AI、VR、AR等技术的发展,助推智能电视、机顶盒等电视终端成为智能家居领域不可忽视的重要设备。随着4K超高清(UHD)技术、虚拟现实技术(VR)和增强现实技术(AR)的普及,并向8K超高清技术不断渗透,电视终端将可以为消费者提供更清晰的视觉体验…

【简单】228. 汇总区间

原题链接:https://leetcode.cn/problems/summary-ranges/description/ 228. 汇总区间 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖&…

vue通过draggable实现拖拽功能

1. 官方文档 2. 安装 yarn add vuedraggable npm i -S vuedraggable <script src"//cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.20.0/vuedraggable.umd.min.js"></script> 3. 其他组件&#xff1a; sortablejs.js拖拽 非官网文档 npm install …

PingCode DevOps 团队:企业CICD流水线可能会遇到的问题及解法

CICD 流水线是指一系列自动化的构建、测试和部署步骤&#xff0c;用于将应用程序从开发到生产环境的过程。在 CICD 流水线中&#xff0c;每个步骤都是自动化的&#xff0c;并且在完成后会触发下一个步骤的执行。 CICD 的价值 CICD 流水线可以帮助团队更快地交付产品&#xff…

16 Linux之JavaEE定制篇-搭建JavaEE环境

16 Linux之JavaEE定制篇-搭建JavaEE环境 文章目录 16 Linux之JavaEE定制篇-搭建JavaEE环境16.1 概述16.2 安装JDK16.3 安装tomcat16.4 安装idea2020*16.5 安装mysql5.7 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&#xff0…

Windows右键添加用 VSCODE 打开

1.安装VSCODE时 安装时会有个选项来添加&#xff0c;如下&#xff1a; ①将“通过code 打开“操作添加到windows资源管理器文件上下文菜单 ②将“通过code 打开”操作添加到windows资源管理器目录上下文菜单 说明&#xff1a;①②勾选上&#xff0c;可以对文件&#xff0c;目…

XSS 攻击是什么?怎么验证是否有XSS攻击漏洞?

XSS&#xff08;跨站脚本&#xff0c;Cross-Site Scripting&#xff09;攻击是一种网络攻击&#xff0c;攻击者利用网站漏洞将恶意脚本注入用户的浏览器&#xff0c;从而在用户浏览网页时执行恶意代码。这种攻击可能造成用户敏感信息泄露、钓鱼、欺诈等安全问题。 验证是否有 …

C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary&g…

算法训练第五十二天

718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size() 1,vector<int>(nums2.size() 1,0));int res…

Windows docker desktop 基于HyperV的镜像文件迁移到D盘

Docker desktop的HyperV镜像文件&#xff0c;默认是在C盘下 C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx如果部署的软件较多&#xff0c;文件较大&#xff0c;或者产生日志&#xff0c;甚至数据等&#xff0c;这将会使此文件越来越大&#xff0c;容易导致C盘空间…

java 浅谈ThreadLocal底层源码(通俗易懂)

目录 一、ThreadLocal类基本介绍 1.概述 : 2.作用及特定 : 二、ThreadLocal类源码解读 1.代码准备 : 1.1 图示 1.2 数据对象 1.3 测试类 1.4 运行测试 2.源码分析 : 2.1 set方法解读 2.2 get方法解读 一、ThreadLocal类基本介绍 1.概述 : (1) ThreadLocal&#xff0c;本…

[机缘参悟-103] :IT人关于接纳的思考与感悟

目录 前言&#xff1a; 一、接纳 1.1 什么是接纳 1.2 对接纳的误解 1.3 接纳的含义 1.4 "存在即合理" VS 接纳 1.5 接纳 VS 躺平 VS 随遇而安 1.6 为什么现实总是那么不尽人意 1.7 现实世界的多样性 1.8 接纳与认命 1.9 不接纳的表现 前言&#xff1a; …

python3.11教程1:python基础语法、程序控制、函数

文章目录 一、Python简介1.1 为什么学习python1.2 python安装与配置1.3 python解释器1.4 命令行参数1.4.1 sys.argv变量1.4.2 -c和-m选项 1.5 解释器的运行环境1.5.1 编码格式1.5.2 编码声明 二、Python基础语法2.1 行结构2.2 变量&#xff08;标识符&#xff09;2.3 字节串2.4…

神经网络NLP基础 循环神经网络 LSTM

用的时候&#xff0c;只关心token的输入&#xff0c;以及hidden state就好了 sequence的length是多少&#xff0c;lstm的cell的数量就是多少 LSTM BI-LSTM stacked lstm GRU 实现

【计算机网络】TCP 的三次握手和四次挥手

TCP 是面向连接的&#xff0c;面向连接就是数据通讯的时候需要进行三次握手&#xff0c;断开通讯的时候需要进行四次挥手。 1.seq(sequence number)&#xff0c;序列号&#xff0c;随机生成的 2.ack(acknowledgement number)&#xff0c;确认号&#xff0c;ackseq1 3.ACK(ackno…

Linux安装JenkinsCLI

项目简介安装目录 mkdir -p /opt/jenkinscli && cd /opt/jenkinscli JenkinsCLI下载 wget http://<your-jenkins-server>/jnlpJars/jenkins-cli.jar # <your-jenkins-server> 替换为你的 Jenkins 服务器地址 JenkinsCLI授权 Dashboard-->Configure Glob…