【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控
答应我,这篇一定要看到最后~!
<前文回顾>
<今日更新>
一、开篇整活儿
今儿个咱唠唠 Spring Boot 里头的 AOP(面向切面编程)。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。
二、AOP 是啥玩意儿?
AOP 是 Spring 里头的一个高级特性,用来在不修改原有代码的情况下,给程序动态添加功能。比如说,你可以用 AOP 来记录日志、监控性能、处理异常啥的。Spring Boot 里头默认就集成了这玩意儿,用起来贼方便。
1. AOP 的核心概念
AOP 里头有几个核心概念:切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)。
- 切面:就是你要添加的功能,比如说日志记录、性能监控啥的。
- 连接点:就是程序执行过程中的某个点,比如说方法调用、异常抛出啥的。
- 通知:就是切面在连接点执行的动作,比如说在方法调用前记录日志。
- 切点:就是用来匹配连接点的表达式,比如说匹配某个包下的所有方法。
2. AOP 的通知类型
AOP 里头有五种通知类型:
- 前置通知(Before):在连接点之前执行。
- 后置通知(After):在连接点之后执行,不管连接点是否抛出异常。
- 返回通知(AfterReturning):在连接点正常返回后执行。
- 异常通知(AfterThrowing):在连接点抛出异常后执行。
- 环绕通知(Around):在连接点前后都执行,可以控制连接点的执行。
三、用 AOP 实现日志记录
日志记录是 AOP 的经典应用场景。你可以用 AOP 来记录方法的调用信息,方便以后排查问题。
1. 定义切面
首先,你得定义一个切面,用 @Aspect 注解标记。
Java Code |
@Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); } |
这段代码里头,LoggingAspect 是一个切面,@Aspect 注解标记了这个类,@Component 注解让 Spring 管理这个类。
2. 定义切点
然后,你得定义一个切点,用 @Pointcut 注解标记。
Java Code |
@Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} } |
这段代码里头,serviceMethods 是一个切点,execution(* com.example.demo.service.*.*(..)) 表示匹配 com.example.demo.service 包下的所有方法。
3. 定义通知
最后,你得定义通知,用 @Before、@After、@AfterReturning、@AfterThrowing 或 @Around 注解标记。
Java Code |
@Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} @Before("serviceMethods()") public void logMethodCall(JoinPoint joinPoint) { logger.info("调用方法:{}", joinPoint.getSignature().getName()); } } |
这段代码里头,logMethodCall 是一个前置通知,@Before 注解标记了这个方法,JoinPoint 参数用来获取连接点的信息。
四、用 AOP 实现性能监控
性能监控是 AOP 的另一个经典应用场景。你可以用 AOP 来记录方法的执行时间,方便以后优化性能。
1. 定义切面
首先,你得定义一个切面,用 @Aspect 注解标记。
Java Code |
@Aspect @Component public class PerformanceAspect { private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class); } |
这段代码里头,PerformanceAspect 是一个切面,@Aspect 注解标记了这个类,@Component 注解让 Spring 管理这个类。
2. 定义切点
然后,你得定义一个切点,用 @Pointcut 注解标记。
Java Code |
@Aspect @Component public class PerformanceAspect { private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class); @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} } |
这段代码里头,serviceMethods 是一个切点,execution(* com.example.demo.service.*.*(..)) 表示匹配 com.example.demo.service 包下的所有方法。
3. 定义通知
最后,你得定义通知,用 @Around 注解标记。
Java Code |
@Aspect @Component public class PerformanceAspect { private static final Logger logger = LoggerFactory.getLogger(PerformanceAspect.class); @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} @Around("serviceMethods()") public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long endTime = System.currentTimeMillis(); logger.info("方法 {} 执行时间:{} 毫秒", joinPoint.getSignature().getName(), endTime - startTime); return result; } } |
这段代码里头,measureMethodExecutionTime 是一个环绕通知,@Around 注解标记了这个方法,ProceedingJoinPoint 参数用来控制连接点的执行。
五、AOP 的坑点
1. 切点表达式写错了
AOP 里头,切点表达式写错了,那通知就不起作用了。你要是写错了,那可得好好检查检查。
Java Code |
@Pointcut("execution(* com.example.demo.service.*.*(..))") // 写错了 public void serviceMethods() {} |
这段代码里头,execution 写错了,应该是 execution。
当然,写不好表达式,可以问AI啊。
2. 通知顺序不对
AOP 里头,通知顺序不对,那结果就不对了。你要是顺序不对,那可得好好调整调整。
Java Code |
@Before("serviceMethods()") public void logMethodCall(JoinPoint joinPoint) { logger.info("调用方法:{}", joinPoint.getSignature().getName()); } @Around("serviceMethods()") public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long endTime = System.currentTimeMillis(); logger.info("方法 {} 执行时间:{} 毫秒", joinPoint.getSignature().getName(), endTime - startTime); return result; } |
这段代码里头,logMethodCall 和 measureMethodExecutionTime 的顺序很重要。
3. 切面没被 Spring 管理
AOP 里头,切面没被 Spring 管理,那通知就不起作用了。你要是没被管理,那可得好好检查检查。
Java Code |
@Aspect // 没加 @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} @Before("serviceMethods()") public void logMethodCall(JoinPoint joinPoint) { logger.info("调用方法:{}", joinPoint.getSignature().getName()); } } |
这段代码里头,LoggingAspect 没加 @Component 注解,Spring 不会管理这个类。
六、额外再说一点
对于大多数 Spring Boot 项目,如果你只是简单地使用 AOP 来实现日志记录、事务管理等功能,并且已经引入了 spring-boot-starter-aop 依赖,那么通常不需要显式地使用 @EnableAspectJAutoProxy 注解。Spring Boot 会自动为你处理相关的配置。
然而,如果你有特殊的需求,比如自定义代理创建策略或确保 AOP 支持被启用,那么你可以考虑显式地使用 @EnableAspectJAutoProxy 注解。
专有名词解释
- AOP:面向切面编程,一种编程范式,用来在不修改原有代码的情况下,给程序动态添加功能。
- 切面:AOP 里头的一个概念,表示你要添加的功能。
- 连接点:AOP 里头的一个概念,表示程序执行过程中的某个点。
- 通知:AOP 里头的一个概念,表示切面在连接点执行的动作。
- 切点:AOP 里头的一个概念,表示用来匹配连接点的表达式。
- 前置通知:AOP 里头的一种通知类型,在连接点之前执行。
- 后置通知:AOP 里头的一种通知类型,在连接点之后执行。
- 返回通知:AOP 里头的一种通知类型,在连接点正常返回后执行。
- 异常通知:AOP 里头的一种通知类型,在连接点抛出异常后执行。
- 环绕通知:AOP 里头的一种通知类型,在连接点前后都执行。
- JoinPoint:AOP 里头的一个接口,用来获取连接点的信息。
- ProceedingJoinPoint:AOP 里头的一个接口,用来控制连接点的执行。
写在最后
身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...
我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。
当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。
另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。
最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!
(来呀~↓↓↓↓↓↓↓↓老铁~)
相关文章:
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控
答应我,这篇一定要看到最后~! <前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&a…...
【算法】快速幂
一、概念 快速幂是一种高效的指数运算,当指数范围过大时,通过位运算能够减少大量的计算次数 对于,我们通过将指数b转化为二进制数,就可以将分解为许多的(其中i是指数b中对应位为1的位数) 例如࿰…...
使用卷积神经网络识别MNIST数据集
卷积神经网络 卷积神经网络本质是共享权重稀疏链接的全连接网络 编写步骤 构建一个神经网络,步骤是几乎不变的,大概有以下几步 准备数据集 #更高级的CNN网络 import torch import torch.nn as nn import torch.nn.functional as F import torchvisi…...
JavaScript 中数组增删改查
在 JavaScript 中,数组是一种用来存储不同类型的值的数据结构。 增加数组元素: let arr = [1, 2, 3];// 在数组末尾添加元素 arr.push(4); console.log(arr); // [1, 2, 3, 4]// 在数组开头添加元素 arr.unshift(0); console.log(arr); // [0, 1, 2, 3, 4]// 在指定位置插…...
【Kettle安装】Kettle安装过程, 电脑已安装java23,安装Kettle 出现报错:尝试启动 Java 虚拟机(JVM)时失败解决方法
Kettle安装 Kettle 通常指的是 Pentaho Data Integration (PDI),这是一款开源的 ETL(Extract, Transform, Load)工具,用于数据集成、数据清洗和数据分析。它的核心工具名为 Spoon,但整个项目常被直接称为 Kettle 数据…...
Spring笔记04-注解注入
1.导入包 <dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId>…...
[动规19] 最大子数组和
目录 1. 题意 2. 思路 2.1. 状态表示 2.2. 状态转移方程 2.3. 初始化 2.4. 填表顺序 2.5. 返回值 3. 编码 1. 题意 链接: 53. 最大子数组和 - 力扣(LeetCode) 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组&…...
2024年零知识证明(ZK)研究进展
Sumcheck 整个领域正在转向更多地依赖于 Sumcheck Protocol Sumcheck是用于验证多项式承诺的协议,常用于零知识证明(ZKP)中,尤其是在可验证计算和扩展性上。它的主要目的是通过对多项式进行分段检查,从而保证某个多项…...
1. 两数之和
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 使用map,key作为数值,value作为下标先寻找对应的目标值,如果找到了则直接返回,否则在往map中插入 提示:小白个人理…...
【电动汽车再生制动控制技术(万字长文,图文并茂)】
电动汽车再生制动控制系统概述 电动汽车再生制动的基本原理是:通过具有可逆作用的电动机/发电机来实现电动汽车动能和电能的转化。在汽车减速或制动时,可逆电机以发电机形式工作,汽车行驶的动能带动发电机将汽车动能转化为电能并储存在储能器(蓄电池或超级电容器)中;在汽车…...
python实现股票数据可视化
最近在做一个涉及到股票数据清洗及预测的项目,项目中需要用到可视化股票数据这一功能,这里我与大家分享一下股票数据可视化的一些基本方法。 股票数据获取 目前,我已知的使用python来获取股票数据方式有以下三种: 爬虫获取,实现…...
2025年湖南建筑安全员 C1考证刷题题库
湖南建筑安全员 C1 类的练习题: 1、塔机的拆装作业必须在白天进行,不得在( )情况下进行。 A. 夜间 B. 大风 C. 浓雾 D. 以上都是 答案:D 2、采用钢筋混凝土灌注桩时,开挖标准是桩身混凝土达到&#…...
【Feign】⭐️使用 openFeign 时传递 MultipartFile 类型的参数参考
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时三分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…...
ToolsSet之:梯度色板
ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用,应用基本功能介绍可以查看以下文章: Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Media菜单下的“Gradient Palette”工…...
Apache Hive和Snowflake的`CREATE VIEW`语法和功能特性整理的对比表
写一个Apache Hive中CREATE VIEW语句转换为对应Snowflake中CREATE VIEW语句的程序,现在需要一个根据功能的相似性对应的Apache HiveQL和Snowflake SQL的CREATE VIEW语句的表。 以下是基于Apache Hive的CREATE VIEW语法规则构造的所有可能合法语句实例及其功能说明&…...
【测试】每日3道面试题 3/31
长期更新,建议关注收藏点赞。 单元测试策略有哪些,主要内容。 白盒测试黑盒测试基于异常和边界的测试 主要内容:测试用例设计、执行、结果分析、自动化beta测试和alpha测试主要区别 主要区别:测试环境测试者 alphabeta时间先后测…...
用 Hugging Face Spaces 打造哪吒的 3D 模型:完整指南
引言: 哪吒,这位中国神话中的传奇人物,以其独特的形象和故事深受人们喜爱。如今,通过 Hugging Face Spaces 提供的 TripoSG 工具,我们可以轻松创建哪吒的 3D 模型。以下是详细步骤,帮助你将这个神话角色带入…...
鸿蒙应用元服务开发-Account Kit概述
Account Kit(华为账号服务)提供简单、快速、安全的登录功能,让用户快捷地使用华为账号登录元服务。用户授权后,Account Kit可提供头像、手机号码等信息,帮助元服务更了解用户。Account Kit提供的SampleCode示例工程体现…...
美团小程序 mtgsig1.2 拼好饭案例 分析 mtgsig
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 美团网页、小程序、app全是指…...
hadoop集群和常用命令
Hadoop集群的搭建与管理 1. HADOOP简介 Hadoop 是一种用于大规模数据处理的大数据框架,支持通过简单编程模型实现跨计算机集群的数据分布存储和计算3。 2. HADOOP集群部署过程 (1) 解压并安装HADOOP 在虚拟机环境中,可以通过解压缩方式完成Hadoop的安…...
爬虫:基本流程和robots协议
基本流程: 1.确认目标:url:www.baidu.com 2.发送请求:发送网络请求,获取到特定的服务端给你的响应 3.提取数据:从响应中提取特定的数据 4.保存数据:本地(html,json,txt),数据库 获取到的响应…...
python之三种去重方法
1. 数据读取与参数解析 代码片段 detail pd.read_csv(detail.csv, index_col0, encodinggbk)数据实例 参数详解 index_col0: 作用:将第1列设置为索引其他选项: None:不指定索引列(默认)列序号/列名&…...
QML输入控件: TextField(文本框)的样式定制
目录 引言示例简介示例代码与关键点示例1:基础样式定制示例2:添加图标示例3:交互式元素(清除按钮) 实现要点总结完整工程下载 引言 在Qt Quick应用程序开发中,文本输入是最常见的用户交互方式之一。TextFi…...
Visual Studio | 性能探测器
文章目录 一、性能探测器1、核心功能2、数据采集3、数据分析3.1、CPU分析 前言: Visual Studio(VS)提供的性能探测器(Performance Profiler)是一款强大的工具,它能够帮助开发者分析应用程序的性能ÿ…...
数据库中的函数:高效操作与灵活运用
数据库中的函数:高效操作与灵活运用 在数据库开发过程中,函数是常用的工具,可以帮助我们更高效地处理和操作数据。无论是对字符串、数值、日期还是流程控制,数据库函数都能够提供强大的支持。本文将深入探讨常见的数据库函数&…...
《非暴力沟通》第十二章 “重获生活的热情” 总结
《非暴力沟通》第十二章 “重获生活的热情” 的核心总结: 本章将非暴力沟通的核心理念延伸至生命意义的探索,提出通过觉察与满足内心深处的需要,打破“义务性生存”的桎梏,让生活回归由衷的喜悦与创造。作者强调,当行动…...
C++位运算精要:高效解题的利器
引言 在算法竞赛和底层开发中,位运算(Bit Manipulation)因其极高的执行效率而广受青睐。它能在O(1)时间复杂度内完成某些复杂操作,大幅优化程序性能。本文系统梳理C位运算的核心技巧,涵盖基础操作、经典应用、优化策略…...
从两种遍历方法中构造二叉树
从前序与中序遍历序列构造二叉树 题目描述 代码实现 class Solution { private:unordered_map<int, int> mapIn;TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right){//出口if(…...
【C语言】字符函数的易错点及其模拟实现
在上一章为大家简单介绍了字符函数的种类和基础运用,语法。那么在本章为大家分享一些易错点和自己如何编写一个自定义函数来实现相同的作用。(点个关注呗) 一strlen:计算字符串长度 1. 函数原型 size_t strlen(const char *str…...
【前端】创建一个vue3+JavaScript项目流程
1、检查node和npm是否安装,查看版本: node -v npm -v 2、安装脚手架cli或vite (1)cli 安装:npm install -g vue/cli 检查是否安装成功:vue -v 使用cli创建项目:vue create my-project(项目名)--…...
JVM面试专题
目录 1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 1.2 什么是程序计数器? 1.3 你能给我详细的介绍Java堆吗? 元空间(MetaSpace)介绍 1.4 什么是虚拟机栈 1.5 方法区 1.5.1 概述 1.5.2 常量池 1.5.3 运行时常量池 1.6 你听过…...
齐次线性方程组及python求解
齐次线性方程组的概念 齐次线性方程组是指所有常数项都为零的线性方程组,其一般形式为: a 11 x 1 a 12 x 2 ⋯ a 1 n x n 0 a_{11}x_1 a_{12}x_2 \cdots a_{1n}x_n 0 a11x1a12x2⋯a1nxn0 a 21 x 1 a 22 x 2 ⋯ a 2 n x n 0 a_…...
鸿蒙前后端项目源码-点餐v3.0-原创!原创!原创!
鸿蒙前后端点餐项目源码含文档ArkTS语言. 原创作品.我半个月写的原创作品,请尊重原创。 原创作品,盗版必究!!!! 原创作品,盗版必究!!!! 原创作…...
【数据结构】算法效率的双刃剑:时间复杂度与空间复杂度
前言 在算法的世界里,效率是衡量算法优劣的关键标准。今天,就让我们深入探讨算法效率的两个核心维度:时间复杂度和空间复杂度,帮助你在算法设计的道路上更进一步。 一、算法效率:衡量算法好坏的关键 算法的效率主要…...
Linux | I.MX6ULL 终结者底板原理图讲解(5)
01 USB 转串口电路 I.MX6ULL 终结者开发板板载了一个 USB 串口,原理图如图 1 和图 2 所示: USB 转串口我们使用的是 CH340G 芯片,该芯片是由南京沁恒微电子研发生产的一款国产芯片。CH340G的工作电压支持 3.3V、5V,甚至是 3V,从上图可以看到我们给 CH340G 的电压是 5V…...
java拆分字符串、去重并统计相关长度
java拆分字符串、去重并统计相关长度 20250331 19:52 求取逗号隔开的字符串的 的长度,要求去重。拆分字符串应该是指按照某种分隔符将字符串分割成多个部分,然后去除重复的部分,最后统计处理后各个部分的长度或者总长度。 这时候可能需要明确…...
Vue 2 和 Vue 3 有什么区别
Vue 2 和 Vue 3 是 Vue.js 框架的两个主要版本,它们在核心特性、性能、API 设计等方面有一些显著的区别。以下是它们的主要区别: 1. 核心特性 • Composition API: • Vue 3 引入了 Composition API,这是一种新的 API࿰…...
RabbitMQ、RocketMQ 和 Kafka 的消息特性对比
以下是 RabbitMQ、RocketMQ 和 Kafka 在保证消息不丢失、消息顺序、消息幂等性以及快速处理积压方面的详细对比: 1. 消息不丢失 特性RabbitMQRocketMQKafka生产者端开启事务或 Confirm 模式使用事务消息机制设置 acksall 确保消息被所有副本确认服务端消息持久化&…...
Logback 实现不同包的日志记录到不同文件
核心 通过合理配置多个 appender 来定义不同的日志输出目的地通过 logger 元素将不同的包与对应的 appender 关联起来同时利用 additivity 属性控制日志的传递,从而实现精准的日志输出管理。 additivity 属性控制日志传递: additivity 属性决定了该 l…...
【附JS、Python、C++题解】Leetcode面试150题(11)H指数
一、题目 274. H 指数 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他…...
C++第13届蓝桥杯省b组习题笔记
1.九进制转十进制 九进制正整数 (2022)9转换成十进制等于多少? 第一位乘9的0次方,第二位乘9的1次方,第三位乘9的二次方以此类推 #include <iostream> using namespace std;int main() {// 请在此输入您的代码int t2022;int res0;int c…...
【学Rust写CAD】19 颜色渐变定义(gradient_stop.rs)
源码 //color/gradient_stop.rs use super::argb::Color; #[derive(Clone, Copy, Debug)] pub struct GradientStop {pub position: f32,pub color: Color, }代码分析 这段代码是一个结构体(struct),并为其派生(deriveÿ…...
从零开始跑通3DGS教程:介绍
写在前面 本文内容 本文所属《从零开始跑通3DGS教程》系列文章,将实现从原始图像(有序、无序)数据开始,经过处理(视频抽帧成有序),SFM,3DGS训练、编辑、渲染等步骤,完整地呈现从原始图像到新视角合成的全部流程&#x…...
探索 Python 编程的宇宙:从基础到进阶的奇妙之旅
在当今的编程世界里,Python 以其简洁、易读和强大的功能,成为了众多开发者的心头好。它就像一个充满无限可能的宇宙,吸引着人们不断去探索其中的奥秘。今天,让我们一起踏上这场 Python 编程的奇妙之旅,从基础到进阶&am…...
使用 Spring AI 和 LangChain4j 实现聊天机器人对比分析
人工智能领域正在彻底改变公司管理客户服务的方式。随着 Spring AI 和 LangChain4j 等专用框架的出现,Java 开发人员现在拥有强大的工具来实现能够从公司数据中学习的智能聊天机器人。在本文中,我们将探讨这两个框架的主要功能,并了解如何使用…...
3月31(信息差)
1.全国首个!湖北为脑机接口医疗服务定价 据湖北省医疗保障局消息,今日,湖北省医保局发布全国首个脑机接口医疗服务价格,其中,侵入式脑机接口植入费6552 元/次,侵入式脑机接口取出费3139元/次,非侵入式脑机接口适配费966元/次,标志着这一前沿科技正式步入民生领域,为无…...
苍穹外卖项目结构
苍穹外卖项目总结-CSDN博客 【苍穹外卖|项目】万字总结-CSDN博客 苍穹外卖项目总结_苍芎外卖如何实现的跨域-CSDN博客 【苍穹外卖 | 项目日记】第九天 万字总结-CSDN博客 【苍穹外卖|项目】万字总结-CSDN博客 一、技术点: Nginx代理 负载均衡:通过…...
3. 无重复字符的最长子串
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 用map,key为char,value为出现次数,将字符串中的值依次入栈,再判断次数是否大于1,如果大于1,则循环删除掉…...
python力扣48.旋转图像
给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…...
文章配图新纪元:OpenAI新推出的GPT-4o原生图像生成功能启示
当OpenAI推出GPT-4o原生图像生成功能时,许多人惊呼:“AI生成的图像已经发展到这样了吗!”这一激动人心的时刻,标志着人工智能在图像创作领域迈出了历史性的一步。无论是细腻的人物肖像,栩栩如生的面部表情,…...