Spring AOP简单介绍

news2024/10/5 19:19:10

什么是AOP

面向切面编程(Aspect-Oriented Programming)是一种编程范式,旨在通过将横切关注点与主要业务逻辑分离,提供一种更好的代码组织和模块化的方式。

AOP的思想是将这些横切关注点从主要业务逻辑中抽离出来,形成一个独立的模块,称为切面。切面可以定义通过预定义的方式或者在运行时动态的与主业务逻辑进行织入,从而实现对横切关注点的统一处理。

AOP可以做什么

AOP可以将横切关注点从主要业务逻辑中分离出来,使主要业务逻辑更加清晰明了。

AOP可以消除重复的代码。通过使用AOP注解或配置,可以将需要切入的代码逻辑集中到切面中,从而避免在每个地方重复编写相同的代码。当切面需要修改时,只需修改一处逻辑,即可实现全局的变更。

AOP可以降低代码的复杂性。通过将横切关注点与主要业务逻辑分离,使得主要业务逻辑更加专注和清晰,减少了代码的混杂程度,提高了代码的可读性和可维护性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVNw0KX6-1692435041635)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/769234ff24bc42c6a90d4c4dfe2130a2~tplv-k3u1fbpfcp-zoom-1.image)]

举个例子

下面是一个简单的例子,说明 AOP 如何解决日志记录的问题:

假设我们有一个类 UserService,其中包含了一些用户管理的方法,如 createUser()、deleteUser() 等。我们希望在每个方法执行前后记录日志。

传统方法
public class UserService {
    public void createUser(User user) {
        Logger.log("Creating user: " + user.getName());
        // 执行创建用户的逻辑
        Logger.log("User created: " + user.getName());
    }

    public void deleteUser(String userId) {
        Logger.log("Deleting user: " + userId);
        // 执行删除用户的逻辑
        Logger.log("User deleted: " + userId);
    }
}
使用AOP
public aspect LoggingAspect {
    before(): execution(public void UserService.*(..)) {
        Logger.log("Method execution started: " + thisJoinPoint.getSignature().getName());
    }

    after(): execution(public void UserService.*(..)) {
        Logger.log("Method execution completed: " + thisJoinPoint.getSignature().getName());
    }
}
public class UserService {
    public void createUser(User user) {
        // 执行创建用户的逻辑
    }

    public void deleteUser(String userId) {
        // 执行删除用户的逻辑
    }
}

如何实现AOP

cglib

CGLIB(Code Generation Library)是基于字节码生成的动态代理库,它通过生成目标类的子类来实现动态代理。相对于 JDK 的动态代理,CGLIB 可以代理没有实现接口的类。

在这里插入图片描述

cglib动态代理流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHB7dH3N-1692435041636)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3c74ad4e999d445a93e10e217762aba6~tplv-k3u1fbpfcp-zoom-1.image)]

图片引用自:
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

JDK

JDK(Java Development Kit)提供了一种基于接口的动态代理机制,通过生成代理类实现对目标类的代理。JDK 动态代理只能代理实现了接口的类。

在这里插入图片描述

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

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

相关文章

【教程】navicat配合HTTP通道远程连接SQLite数据库

前言 🍊缘由 好奇的我想查看服务器上宝塔面板的SQLite数据库 久别一月,特来水文。起因是我看到服务器上搭建的宝塔面板,好奇其中使用的SQLite数据库,想用navicat远程连接看一下,奈何不会玩,特来写一篇文…

java语言B/S架构云HIS医院信息系统源码【springboot】

医院云HIS全称为基于云计算的医疗卫生信息系统( Cloud- Based Healthcare Information System),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、…

使用async/await并不会执行接下来的代码,原因及解决办法

我的错误代码如下: async mounted() {await this.get_table_header()console.log(finish) }get_table_header(click) {const params {project_id: this.projectId,version_id: this.versionId}return new Promise((resolve, reject) > {get_table_header_setti…

基于STM32标准库智能风扇设计

目录 一,前言 二,系统方案选择 三,实体展示 工程分类 四,相关代码 PWM.c PWM.h AD.c AD.h 电机驱动程序 舵机驱动 一,前言 当今生活中,风扇已成为人们解暑的重要工具,然而使用风扇缓解…

一文读懂结构型模式----组合模式!

一、组合模式 1.组合模式的概述 1.1 组合模式是什么 组合模式是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。 三要素: 根节点(root):在一棵非空的树中只有一个根节点&#xff0…

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库,它为从业人员…

PyTorch学习笔记(十五)——完整的模型训练套路

以 CIFAR10 数据集为例,分类问题(10分类) model.py import torch from torch import nn# 搭建神经网络 class MyNN(nn.Module):def __init__(self):super(MyNN, self).__init__()self.model nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.Ma…

C语言:深度学习知识储备

目录 数据类型 每种类型的大小是多少呢? 变量 变量的命名: 变量的分类: 变量的作用域和生命周期 作用域: 生命周期: 常量 字符串转义字符注释 字符串: 转义字符 操作符: 算术操作符…

nginx反向代理、负载均衡

修改nginx.conf的配置 upstream nginx_boot{# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2server 192.168.87.143 weight100 max_fails2 fail_timeout30s; server 192.168.87.1 weight200 max_fails2 fail_timeout30s;# 这里的…

【流程引擎】--Camunda基础及sprringboot简单集成Camunda

目录 一、前言二、Camunda基本介绍2.1、camunda基础--符号表示2.2、camunda基础--网关表示2.3、camunda基础--事件表示 三、springboot集成Camunda四、后续 一、前言 目前市场上有常见的流程引擎:JBPM、Activiti、Camunda、Flowable、CompileFlow。它们的发展史如下…

TR 已经释放 task未释放的问题

货铺QQ群号:834508274 微信群不能扫码进了,可以加我微信SAPliumeng拉进群,申请时请提供您哪个模块顾问,否则是一律不通过的。 进群统一修改群名片,例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接,小…

16-案例-记账单

功能需求: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &l…

224、仿真-基于51单片机音乐播放器流水灯控制Proteus仿真设计(程序+Proteus仿真+原理图+程序流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道&#xff0c;c是一个一本正经的编程语言&#xff0c;因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧&#xff01;&#xff01; 音乐的好处 提升情绪&#xff1a;音乐能够影响我们…

【C++进阶】继承、多态的详解(多态篇)

【C进阶】继承、多态的详解&#xff08;多态篇&#xff09; 目录 【C进阶】继承、多态的详解&#xff08;多态篇&#xff09;多态的概念多态的定义及实现多态的构成条件&#xff08;重点&#xff09;虚函数虚函数的重写&#xff08;覆盖、一种接口继承&#xff09;C11 override…

解决C#报“MSB3088 未能读取状态文件*.csprojAssemblyReference.cache“问题

今天在使用vscode软件C#插件&#xff0c;编译.cs文件时&#xff0c;发现如下warning: 图(1) C#报cache没有更新 出现该warning的原因&#xff1a;当前.cs文件修改了&#xff0c;但是其缓存文件*.csprojAssemblyReference.cache没有更新&#xff0c;需要重新清理一下工程&#x…

双层优化入门(4)—基于对偶变换的双层优化求解

之前的博客介绍了双层优化的基本原理、以及如何使用KKT条件和智能优化算法求解双层优化问题&#xff0c;这篇博客将继续介绍如何通过对偶变换求解双层优化问题。 1.线性规划的对偶问题 参考资料&#xff1a; 运筹学修炼日记&#xff1a;如何优雅地写出大规模线性规划的对偶_刘…

spring boot 整合支付宝微信支付

1.目录结构 2.引入依赖 <!--引入阿里支付--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.11.8.ALL</version></dependency><!--引入微信支付--><depe…

Redis中的淘汰策略

前言 本文主要说明在Redis面临key过期和内存不足的情况时&#xff0c;可以采用什么策略进行解决问题。 Redis中是如何应对过期数据的 正如我们知道的Redis是基于内存的、单线程的一个中间件&#xff0c;在面对过期数据的时候&#xff0c;Redis并不会去直接把它从内存中进行剔…

运用工具Postman快速导出python接口测试脚本

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 一、环境准备 1、安装python&#xff08;使用python2或3都可以&#xff09;…