谈谈spring中AOP

news2024/7/5 8:13:18

概述

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

aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等

 比如我们在进行某一个网站设计的时候,有一个业务模块需要记录操作者进行的操作操作者进行信息的修改的时候,需要进行日志记录(xxx在xxx时间进行了xxx信息的修改),增删查改的时候都需要记录,很明显这部分对于一个“摸鱼”仔来讲,是不能容忍的,意味着我要在每一个业务操作的时候,都需要写这一部分代码。

spring中应用

日志记录
AOP 可以用于记录方法的输入、输出、异常等信息,实现统一的日志记录,而无需在每个方法中都添加日志记录代码。

@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethodExecution(JoinPoint joinPoint) {
        System.out.println("Method " + joinPoint.getSignature().getName() + " is about to be executed.");
    }

}

事务管理
AOP 可用于实现事务管理,确保在一系列相关操作中,要么全部成功执行,要么全部回滚。

@Service
public class TransactionalService {

    @Transactional
    public void performTransactionalOperation() {
        // 事务管理的业务逻辑
    }
}

知识点补充

核心概念 
  1. Join point :连接点,表示程序执行期间的一个点,在 Spring AOP 表示的就是一个方法,即一个方法可以看作是一个 Join point
  2. pointcut :切点,就是与连接点匹配的谓词,什么意思呢,就是需要执行 Advice 的连接点就是切点
  3. Advice :增强,在连接点执行的操作,分为前置、后置、异常、最终、环绕增强五种
  4. Aspect :切面,由 pointcut 和 Advice 组成,可以简单的认为 @Aspect 注解的类就是一个切面
  5. Target object :目标对象,即 织入 advice 的目标对象
  6. AOP proxy :代理类,在 Spring AOP 中, 一个 AOP 代理是一个 JDK 动态代理对象或 CGLIB 代理对象
  7. `Weaving` :织入,将 Aspect 应用到目标对象中去
常用注解
  1. @Aspect:用于标记一个类为切面类。

  2. 切点表达式相关注解:

    • @Pointcut:定义一个切点,表示哪些方法需要被织入。
  3. 通知类型相关注解:

    • @Before:在方法执行前执行通知。
    • @After:在方法执行后执行通知。
    • @AfterReturning:在方法返回结果后执行通知。
    • @AfterThrowing:在方法抛出异常后执行通知。
    • @Around:在方法执行前后都执行通知。
  4. 引入类型相关注解:

    • @DeclareParents:引入新的接口和实现类,使得目标类也具有该接口的特性。
  5. 其他注解:

    • @Order:指定切面的优先级顺序,数值越小优先级越高。
    • @EnableAspectJAutoProxy:启用自动代理。
切点表达式

根据表达式描述匹配方法,是最通用的表达式类型,可以匹配方法、类、包。

表达式模式:

execution(modifier? ret-type declaring-type?name-pattern(param-pattern) throws-pattern?)

表达式解释:

  • modifier:匹配修饰符,public, private 等,省略时匹配任意修饰符
  • ret-type:匹配返回类型,使用 * 匹配任意类型
  • declaring-type:匹配目标类,省略时匹配任意类型
    • .. 匹配包及其子包的所有类
  • name-pattern:匹配方法名称,使用 * 表示通配符
    • * 匹配任意方法
    • set* 匹配名称以 set 开头的方法
  • param-pattern:匹配参数类型和数量
    • () 匹配没有参数的方法
    • (..) 匹配有任意数量参数的方法
    • (*) 匹配有一个任意类型参数的方法
    • (*,String) 匹配有两个参数的方法,并且第一个为任意类型,第二个为 String 类型
  • throws-pattern:匹配抛出异常类型,省略时匹配任意类型

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

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

相关文章

尚硅谷JavaWeb电子书城项目(Java+Mysql+Tomcat+Jsp)

自己写的在线电子书城项目,可改写,添加功能,如打折,分类,用户管理,评论等功能。 使用方法: 1.使用idea导入项目。 2.数据库要用项目resource文件里的book.sql文件建立。 3.修改jdbc.properi…

Text2SQL学习整理(一) 综述

数据库由一张或多张表格构成,表格之间的关系通过共同的列(外键)关联,人们使用数据库来方便的记录和存储信息。SQL是广泛应用的关系型数据库查询语言,但是对于普通用户而言,编写SQL语句有一定的难度。 Text…

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 可…

【Linux】键盘高级操作技巧

命令行最为珍视的目标之一就是懒惰:用最少的击键次数来完成最多的工作。另一个目标是你的手指永 远不必离开键盘,永不触摸鼠标。因此,我们有必要了解一些键盘操作,使我们用起来更加的迅速和高效。 移动光标 在前面介绍过上下左右…

【Spring】之Ioc和Aop快速了解

这里写目录标题 1.Spring框架是什么?简介:总结:Spring框架,可以理解为是一个管理者:管理整个分层架构(MVC)中的每一个对象;(每一个对象称之为bean) 2.Spring框…

Kubernetes技术与架构-调度 1

Kubernetes技术与架构集群对Pod的资源调度策略分为三个部分,其中包括匹配调度、优先调度以及终止调度,匹配调度是指将Pod匹配到适合、指定的Node服务器节点中运行,优先调度是指终止优先级低的Pod而优先匹配优先级高的Pod到适合的Node服务器节…

通过阿里云服务器实现访问自己的网站,域名绑定教程

人的梦想,永远不会结束!——黑胡子 请把那把刀给我吧!我要会连她的份也一起努力的,我要成为世界第一的大剑客,我要让我的名字,响彻天堂!——索隆 准备:服务器,域名&…

双指针训练

1.原理 双指针是一种解题常用方法,常用于将数组按照某种要求进行分块/划分,这里的指针对于数组来说,可以替换成下标(毕竟使用下标实际上就是用了指针)。 1.1.划分区间 通常将这两个指针命名位dest/cur(或…

求Top K问题

1.大小根堆解决Top k问题 传统思想:是将容器中的数据进行排序,排序的时间复杂度最差像冒泡是O(n^2),最好像快排是O(nlogn)。 如何在线性时间内O(n)找到Top K的元素呢? 相当于将原始序列遍历一遍就可以找到相应的元素,其实也没有必要将所有…

C语言之函数式宏

目录 函数和数据类型 函数式宏 函数和函数式宏 函数式宏和对象式宏 不带参数的函数式宏 函数式宏和逗号运算符 函数式宏和函数类似并且比函数更加灵活,下面我们就来学习函数式宏的相关内容。 函数和数据类型 我们来编写一个程序,它能计算出所读取…

python蓝桥杯的回形取数

#来源于蓝桥杯的训练 题号是用户登录https://www.lanqiao.cn/problems/1517/learning/?page1&first_category_id1&problem_id1517 根据题目描述可以知道,我们传入的是一个矩阵。 在这里我们使用列表来实现矩阵。 那么,我们直接看代码 dir …

超详细 | 黏菌算法原理、实现及其改进与利用(Matlab/Python)

测试函数为F15 在MATLAB中执行程序结果如下: 在Python中执行程序结果如下: 众所周知,麻雀搜索算法SSA是2020年由东华大学沈波教授团队提出[1]的一种性能十分优异的优化算法,而最近作者发现,在2020年还提出了一个优…

腾讯云:AI云探索之路

随着科技的飞速发展,人工智能(AI)云计算领域日益显现出其巨大的潜力和价值。在这个充满挑战和机遇的领域,腾讯云凭借其卓越的技术和创新能力,取得了令人瞩目的成果。本文将深入探讨腾讯云在AI云计算领域的优势,以及其为人工智能发…

Post Json数据与Form表单数据转换器

具体请访问:在线Json转Form表单参数工具

python绘制gif动图--避免收费拒绝水印

在cp源码解读-CSDN博客文章浏览阅读341次,点赞4次,收藏6次。coreutils:cp源代码分析https://blog.csdn.net/zhaiminlove/article/details/135026160中为了直观的表达文件是如何一步步的copy的,就想到了做一个gif,但是从来没弄过,一下有点麻爪了。 首先想到的是百度、Goog…

孩子都能学会的FPGA:第三十三课——用FPGA实现一个通用的SPI主机接收模块

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿…

C语言指针4

1. #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>int main() {int a 10;int* p &a;//一级指针int** pp &p;//二级指针return 0; }上述代码中p的类型是int* pp的类型是int** 2.int* arr[5]; 数组arr的每个元素是整形指针 3.定义一个变量时,去掉变…

报数游戏C语言

分析:掌握数字移动的规律&#xff0c;以及判断&#xff0c;我们可以用一个二维数组来记录每一个人说的数字&#xff0c;就像第一张图片一样&#xff0c;西安向右边移动&#xff0c;再向左下移动&#xff0c;再向左边移动&#xff0c;在向右边移动&#xff0c;在可以用一个数组来…

3 - Electron BrowserWindow对象 关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

比特币即自由

号外&#xff1a;教链内参12.15《疯狂的铭文》 文 | Ross Ulbricht. 原文标题&#xff1a;Bitcoin Equals Freedom. 2019.9.25 在中本聪发明比特币后的头一年左右&#xff0c;发生了一些特别的事情&#xff0c;不仅没有人预料到&#xff0c;甚至很多人认为不可能。试着想象一下…