- 博客(111)
- 收藏
- 关注
原创 Spring AMQP如何通过配置文件避免硬编码实现解耦
本文介绍了两种SpringAMQP声明监听者的方式:1)基于注解使用常量类避免硬编码,通过@RabbitListener直接引用MQConstant中的常量;2)基于编程式配置,通过yml文件定义交换机、队列和绑定关系,利用AmqpConfigProperties动态加载配置并注册到RabbitMQ。后者通过DynamicAmqpConfig类实现配置初始化,配合AmqpMessageSender发送消息,监听器通过@RabbitListener从配置中获取队列名。两种方式都能有效避免硬编码,常量类方式更简
2025-08-16 16:11:16
217
原创 【软件设计模式】前置知识类图、七大原则(精简笔记版)
本文系统介绍了软件设计中的UML类图与面向对象设计原则。UML类图部分详细解析了类的基本表示方法(类名、属性、操作)和五种核心关系(泛化、聚合、组合、依赖、关联),并说明了接口实现与多重性表示方法。设计模式部分阐述了其四大要素(名称、问题、解决方案、效果)和三大分类(创建型、结构型、行为型),列举了GoF23种经典模式。最后重点讲解了面向对象七大设计原则,包括单一职责、开闭原则、里氏替换等,强调通过抽象、组合等方式实现高内聚低耦合的系统设计。这些知识为构建可扩展、可维护的软件系统提供了方法论指导。
2025-08-15 15:34:00
957
原创 【软件设计模式】工厂方法与抽象工厂
本文系统回顾了工厂方法模式和抽象工厂模式两种设计模式。工厂方法模式通过将对象创建延迟到子类,实现产品与客户端的解耦,适合单一产品的灵活扩展,如咖啡店案例展示了不同咖啡类型的生产。抽象工厂模式则针对产品族的创建,确保相关产品的兼容性,如电脑配件示例中同一品牌的CPU与主板的配套生产。两种模式各有优劣:工厂方法易于扩展新产品但类数量增加;抽象工厂保证产品一致性但难以新增产品类型。文章通过代码示例和日常类比,阐述了两种模式的适用场景、实现方式和设计原则,为软件系统构建提供了灵活的对象创建方案。
2025-08-15 10:14:35
965
原创 Docker精简复习笔记
本文系统总结了Docker容器化技术的核心知识点。首先介绍了Docker的概念、优势及与传统虚拟机的区别,重点讲解了Docker三大核心组件(镜像、容器、仓库)及其关系。详细解析了Docker架构、镜像加速配置、常用命令操作,并深入探讨了Dockerfile编写规范与镜像构建方法。此外,还涵盖了数据持久化(卷与挂载)、网络配置以及多容器协作的Docker Compose工具使用。通过实际案例演示了从镜像构建到容器部署的完整流程,为开发者提供了一套完整的Docker学习与实践指南。
2025-08-12 09:00:00
1164
原创 Spring Security安全框架(结合RBAC思想实现自用实例模版)
本文介绍了基于Spring Security框架的RBAC权限控制实现。首先概述了Spring Security的核心功能(身份认证与授权)及其架构原理,重点分析了过滤器链机制。接着详细讲解了认证流程,包括自定义UserDetailsService、AuthenticationProvider和JWT过滤器的实现。然后阐述了授权机制,通过@PreAuthorize注解实现方法级权限控制。最后展示了自定义认证失败处理器和访问拒绝处理器的开发方法。文章结合代码实例,完整呈现了从RBAC设计到Spring Sec
2025-08-12 08:30:00
1130
原创 关于SpringSecurity 自定义 AccessDeniedHandler 不生效的问题
摘要:在Spring Security中配置的AccessDeniedHandler失效问题,通常是由于同时配置了GlobalExceptionHandler全局异常处理器,导致AccessDeniedException被提前捕获。解决方案是在GlobalExceptionHandler中添加@ExceptionHandler(AccessDeniedException.class)方法,重新抛出异常,让AccessDeniedHandler能够正常处理。
2025-08-11 16:37:32
236
原创 关于异常 ‘void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)‘
记录一下这个问题,因为已经遇到两次了,问AI说版本冲突然后一直在改版本到头来还是不行,最后浏览器搜索出来了。接口测试页面时出现的。这个问题是当项目启动后调用。
2025-08-11 14:39:08
206
原创 Spring Cloud Alibaba核心组件综合学习记录
摘要: SpringCloudAlibaba是阿里巴巴基于SpringCloud生态构建的一站式微服务解决方案,提供核心组件支持分布式系统开发。其核心包括:Nacos(服务注册与配置中心)、OpenFeign/Dubbo(服务调用,前者基于HTTP,后者为高性能RPC框架)、SpringCloud Gateway(API网关,负责路由与过滤)、Sentinel(熔断限流,保障服务稳定性)及Seata(分布式事务,支持AT/XA/TCC等模式)。负载均衡通过SpringCloud LoadBalancer实现
2025-08-08 08:00:00
2014
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之多模型评估篇
本文介绍了如何利用AI模型评估生成内容的相关性,避免产生幻觉响应。通过构建评估系统,使用不同模型分别生成和评估内容,确保响应与上下文一致。系统包含EvaluationRequest、EvaluationResponse等核心类,以及RelevancyEvaluator评估器,采用默认模板检查响应是否匹配查询和上下文。示例展示了使用qwen-max生成响应、qwen-plus评估的完整流程,包括向量数据库操作和评估结果验证,最终输出显示评估通过,响应符合预期。
2025-08-06 13:56:13
552
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之模型上下文协议(MCP)篇
摘要:ModelContextProtocol(MCP)是一个规范大型语言模型(LLM)上下文交互的开放协议,提供统一的AI模型集成方式。其Java SDK采用三层架构(Client/Server、Session、Transport层),支持同步/异步通信。Spring AI MCP提供Spring框架集成,包含Client/Server两种Starter,支持STDIO和SSE两种传输协议。STDIO协议适合本地进程通信,SSE协议支持分布式网络通信。配置方面支持YAML和JSON格式,通过@Tool注解
2025-08-06 13:55:32
783
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之工具调用(Tool Calling)篇
摘要:SpringAI通过工具调用机制扩展AI模型能力,支持方法工具(@Tool注解)和函数工具(FunctionToolCallback)两种实现方式。工具调用流程包括:模型请求调用、应用程序执行工具、返回结果给模型处理。工具适用于信息检索和执行操作场景,可通过ToolContext传递上下文,并支持设置returnDirect参数直接返回结果。工具返回值默认由模型处理,也可配置为直接返回客户端。SpringAI提供了灵活的抽象机制,支持自定义ToolCallback实现以满足不同需求场景。
2025-08-05 16:32:53
1062
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之RAG(向量检索增强生成)篇
摘要:本文介绍了GPT模型的局限性(仅支持2021年9月前的数据)以及三种定制AI模型整合自有数据的技术方案:微调(FineTuning)、提示词填充(PromptStuffing)和函数调用(FunctionCalling)。重点讲解了检索增强生成(RAG)技术的原理与实现,包括离线知识库构建(数据加载、文本分割、向量嵌入)和在线交互(问题处理、相似性检索、回答生成)两阶段流程。通过SpringAI框架演示了向量生成、向量存储、ETL管道等核心组件,并以SimpleVectorStore为例展示了RAG的
2025-08-05 16:31:45
707
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之通义千问模型参数调优(ChatOptions)篇
大模型工作原理及参数配置详解 大模型通过五个阶段处理智能问答:文本分词、Token向量化、模型推理、输出Token和最终文本生成。模型通过概率计算选择输出Token,其随机性可通过temperature和top-p参数调节。SpringAI提供了多种输出配置选项,包括控制随机性的temperature(0-1)、限制输出长度的maxTokens、调节多样性的top-k/top-p等。阿里达摩院的DashScopeChatOptions还支持联网搜索和思维链功能,前者可获取实时信息,后者能展示推理过程。这些参
2025-08-03 11:23:11
695
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之对话模型(Chat Model)篇
SpringAIAlibaba框架封装了ChatModel、ImageModel和AudioModel等核心API,简化了与通义系列大模型的交互。支持多模态输入输出(文本、图片、语音),通过自动配置可直接注入各种模型实例。ChatModel实现文本对话,ImageModel提供文生图功能,AudioModel支持语音合成和语音转文字。框架采用统一接口设计,如Prompt输入/Response输出模式,开发者只需关注业务逻辑,无需处理底层交互细节。示例代码展示了如何调用各模型API实现AI服务集成。
2025-08-01 09:07:37
479
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之提示词 (Prompt)篇
本文系统介绍了Prompt工程技术在AI交互中的应用。首先解释了Prompt的概念及其结构化角色(系统、用户、助手、工具),分析了SpringAI中的Prompt类设计。然后详细阐述了Prompt模板技术,包括动态模板、角色分配和资源加载等实现方式。接着深入探讨了提示词工程的核心策略,如清晰指令、示例引导、格式控制等,并提出了防范Prompt攻击的具体措施。最后介绍了多种Prompt工程技术,包括零样本/少样本提示、系统/角色/情境提示、思维链、自洽性、思维树等高级技术,通过SpringAI代码示例展示了这
2025-08-01 09:06:01
1008
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之Advisor 增强篇——如何让AI拥有记忆?
本文介绍了SpringAI中的Advisor机制及其在AI交互中的应用。Advisor作为拦截器组件,可用于修改提示词、记录日志和维护对话记忆。重点讲解了两种典型Advisor:SimpleLoggerAdvisor用于记录请求响应日志,支持自定义格式化输出;BaseChatMemoryAdvisor结合ChatMemory和ChatMemoryRepository实现对话记忆功能。文章详细演示了基于MySQL和Redis的对话记忆存储方案,包括配置、实现和测试过程,展示了如何通过Advisor链实现多轮对
2025-07-31 10:00:00
1096
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之ChatClient篇
下面是官方文档中给出的关于ChatClient 简介:ChatClient提供了与 AI 模型通信的 Fluent API,使用ChatClient可以将与 LLM 及其他组件交互的复杂性隐藏在背后,因为基于 LLM 的应用程序通常要多个组件协同工作(例如,提示词模板、聊天记忆、LLM Model、输出解析器、RAG 组件:嵌入模型和存储),并且通常涉及多个交互,因此协调它们会让编码变得繁琐。ChatClient 类似于应用程序开发中的服务层,它为应用程序直接提供AI 服务。
2025-07-31 09:00:00
593
原创 SSSM框架相关问题总结
AOP即面向切面编程,用于将那些与业务无关但却与多个对象产生影响的公共行为和逻辑封装起来,抽取到一个切面中,实现代码的复用,降低耦合。常见的使用场景有:操作日志记录、性能统计和权限控制等等。
2025-07-26 09:27:38
846
原创 【Spring AI+Spring AI Albaba从零开始的学习之旅】之Spring AI Alibaba入门篇
本文介绍了SpringAI和SpringAIAlibaba框架的使用方法。SpringAI是简化Java应用整合AI功能的工具,SpringAIAlibaba则是专门适配阿里系AI服务的定制版。文章详细演示了两种调用大模型的方式:通过ollama本地部署和阿里云百炼平台API,包括环境配置、代码实现及测试方法。重点展示了如何创建聊天机器人,实现直接输出和流式输出两种响应方式,并提供了完整的pom.xml依赖配置和应用示例。这为Java开发者快速集成AI能力提供了实用指南。
2025-07-25 10:18:27
951
原创 Spring Cloud Gateway 服务网关
Spring Cloud Gateway是 Spring Cloud 生态系统中的一个 API 网关服务,用于替换由Zuul开发的网关服务,基于Spring 5.0+Spring Boot 2.0+WebFlux等技术开发,提供了网关的基本功能,例如安全、监控、埋点和限流等,旨在为微服务架构提供一种简单而有效的统一 API 路由管理方式。
2025-07-25 09:00:00
877
原创 SSM框架中关于Mybatis的技术问题
延迟加载意味着在查询主对象时,不会立即加载其关联的对象(如一对一、一对多关系),而是在首次访问关联对象的属性时,才会触发实际的数据库查询操作。
2025-07-24 14:49:35
773
原创 SSM框架中关于Spring MVC的技术问题
在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot 的 starter。实现一个自定义的 Spring Boot Starter,我们需要创建一个能够被 Spring Boot 自动配置的模块。下面将实现一个简单的 "hello-service" starter,它提供一个问候服务。-- 自定义start -->hello:@Tag(name = "hello接口")@Autowired。
2025-07-23 18:21:20
868
原创 SSM框架中关于Spring的技术问题
AOP即面向切面编程,用于将那些与业务无关但却与多个对象产生影响的公共行为和逻辑封装起来,抽取到一个切面中,实现代码的复用,降低耦合。常见的使用场景有:操作日志记录、性能统计和权限控制等等。
2025-07-23 09:00:00
878
原创 MySQL相关面试问题总结
在MySQL中,索引是一种帮助MySQL高效获取数据的数据结构,它主要用于提高数据检索的效率,减少磁盘IO,同时,索引列能够对数据进行排序,降低数据排序的成本。聚簇索引是指索引结构与数据一同存储在B+树的叶子节点上,即叶子节点就包含完整的数据记录。非聚簇节点是指索引结构与数据分开存储,即叶子节点不包含完整的数据,只存储指向数据行的主键值。回表查询是指通过:通过非聚簇索引查询到数据行的主键值后,再通过主键值查找完整的数据记录。事物是一组操作的集合,它是一组不可分割的单位。
2025-07-21 09:54:34
1255
原创 MySQL主从同步集群(Docker搭建)
主从同步(Master-Slave Replication)是数据库集群中常用的解决方案,通过将主数据库(Master)的数据变更同步到从数据库(Slave),实现数据的多副本存储和读写分离。MySQL主从复制的核心就是二进制日志。二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
2025-07-21 09:00:00
831
原创 MySQL事物相关
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
2025-07-20 16:36:55
1191
原创 Mysql定位慢查询
当页面加载过慢、接口压测响应时间过长(超过1s)时,很可能是因为SQL的执行时间缓慢导致。MySQL 提供了慢查询日志功能,可以记录执行时间超过指定阈值的 SQL 语句。
2025-07-18 17:06:19
1029
原创 关于Mysql开启慢查询日志报错:13 - Permission denied的解决方案
问题得到了解决,重启容器再次查看也是开启的,究其原因,是我在创建挂载文件时没有创建mysql-slow.log文件,导致容器无法挂载,且没有权限创建...这说明配置文件中的slow_query_log并未加载,且直接使用。# 慢查询阈值(单位:秒,超过此值的 SQL 会被记录),导致 MySQL 无法创建或写入日志文件。# 记录未使用索引的查询(可选)
2025-07-18 13:06:23
323
原创 Redis中关于缓存三兄弟(穿透、击穿、雪崩)和数据一致性问题的解决方案实例
缓存穿透就是一个本不存在的key,穿过缓存直接访问数据库数据库,由于数据本就不存在,这样的访问是没有意义的,会对数据库造成不必要的压力。有以下两种常见的解决方案:缓存空对象和布隆过滤器过滤。但是一般我们会选择布隆过滤器过滤这种解决方案。首先,缓存空对象方案,就是当数据库查询返回空时,也将这个空结果进行缓存,并设置一个较短的过期时间。其次,布隆过滤器方案,就是在缓存查询和数据库查询前先进行布隆过滤器过滤掉不存在的key。布隆过滤器的主要作用是用于检索一个元素是否存在于一个集合中。
2025-07-17 17:36:25
938
原创 Redis面试相关问题总结
布隆过滤器的主要作用是用于检索一个元素是否存在于一个集合中。我最长使用的是redisson实现的布隆过滤器,它的底层原理采用的是位图。初始化时会先创建一个很大的数组,里面存放的是0、1数据,一开始是0,key会经过3次哈希计算再模以数组长度来确定的存储下标,将0改为1,这样3个下标就能标明一个key的存在。当然布隆过滤器也是会有误判率的,这个我们是可以设置的,一般不会超过5%,这也是我们能够接受的误判率。
2025-07-17 17:35:34
718
原创 Redis网络模型
Redis是单线程的,可是为什么还这么快?除了基于内存和单线程事件循环,另一个重要原因还是使用IO多路复用模型,三者的结合实现了高并发下的低延迟响应。
2025-07-15 17:39:38
940
原创 Redis集群方案——Redis分片集群
Redis分片集群(Redis Cluster)是Redis官方提供的分布式解决方案,它允许数据自动分布在多个Redis节点上,提供的Redis服务。主从和哨兵可以解决的问题。但是依然有两个问题没有解决:海量数据存储问题高并发写的问题使用分片集群可以解决上述问题,如图:分片集群特征:集群中有多个master,每个master保存不同数据每个master都可以有多个slave节点master之间通过ping监测彼此健康状态客户端请求可以访问集群任意节点,最终都会被转发到正确节点。
2025-07-14 23:00:00
724
1
原创 Docker搭建Redis分片集群
Redis分片集群(Redis Cluster)是Redis官方提供的分布式解决方案,它允许数据自动分布在多个Redis节点上,提供的Redis服务。主从和哨兵可以解决的问题。但是依然有两个问题没有解决:海量数据存储问题高并发写的问题。
2025-07-14 18:23:41
675
原创 Redis集群方案——主从复制
单节点redis的并发能力是有上线的,为了提升redis高并发下的性能,我们可以搭建redis的主从复制集群,实现读写分离。最常用的主从同步集群是一主多从,主节点负责写数据,从节点只负责读数据。
2025-07-12 14:00:00
1193
原创 Docker搭建主从同步集群
d:后台运行-p xxxx:xxxx:指定宿主机端口与容器端口映射关系–name xx:创建的容器名称–privileged=true:获取宿主机root权限-v /home/hl/redis-demo/redis-slave7002/conf:/etc/redis/redis.conf \:映射配置文件目录,宿主机:容器-v -v /home/hl/redis-demo/redis-slave7002/data:/data:映射数据目录,宿主机:容器。
2025-07-12 09:29:52
797
原创 Redis分布式锁
且redisson提供了锁的重试机制,也就是持锁期间有其他线程来请求,那么其他的线程获取锁失败后就会一直循环获取,当然会有一个循环的阈值,这样的好处就是在高并发情况下,能够很好的提高分布式锁的使用性能。redisson实现的分布式锁是可重入的,它的底层使用的是hash数据结构,记录的是线程的id和重入的次数。首先,当一个线程获取分布式锁成功后,锁的默认持有时间为30秒,看门狗机制会每隔锁的持有时间%3,也就是10s来检测当前业务是否还持有锁,若持有锁则继续增加锁的持有时间,完成业务后会自动释放锁。
2025-07-11 15:00:26
1032
原创 Redis数据淘汰策略
当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。
2025-07-09 22:00:00
579
游客管理+导航系统(地图显示并实时更新线路)-MySQL数据库+javase+GUI+迪杰斯特拉算法
2024-05-22
安装docker失败
2024-10-07
Redis存储时碰到枚举变量,存储的value不是我想要返回的,怎么解决?
2024-09-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人