- 博客(775)
- 收藏
- 关注
原创 Spring AI vs LangChain4j:Java AI开发框架完整对比指南
SystemMessage("你是一个专业的客服助手")@SystemMessage("分析以下文本的情感")@SystemMessage("总结以下内容")// 使用.build();String response = assistant.chat("你好");@Tool("查询用户信息")public String queryUser(@P("用户ID") String userId) {try {",return "用户不存在";
2025-07-18 21:46:16
552
原创 快速理解Spring Bean 实例化与初始化全过程
Spring 启动时,会扫描各种配置源,这些配置源可以是 XML 文件、注解或者 Java Config。Spring 会将这些配置信息中的 Bean 定义转换为 BeanDefinition 对象,然后将其注册到 BeanDefinitionRegistry 中。// 伪代码示例:从@Component注解解析BeanDefinition@Component// 对应的BeanDefinition元数据。
2025-07-18 21:42:11
493
原创 Spring Cloud分布式配置中心:架构设计与技术实践
场景推荐方案核心优势Spring生态深度集成无缝兼容,版本管理完善多语言/云原生架构Nacos 3服务发现+配置中心二合一金融/强合规场景审计留痕+灰度发布。
2025-07-18 21:38:53
431
原创 Spring监听器:比MQ更轻的异步神器!亿级流量下的咖啡店经营哲学
/ final修饰的订单ID:就像咖啡师绝不涂改的订单小票// 创建时间:记录订单诞生时刻(线程安全不可变)// 无setter:防止多线程并发篡改订单优秀架构的本质不是预测所有需求,而是拥抱变化。
2025-07-18 21:35:28
195
原创 Spring WebSocket 服务实现的主流方案与最佳实践
Spring-WebSocket 模块:Spring 官方提供的原生支持,与 Spring 生态深度整合。Jakarta EE 规范 API:基于 Java EE 标准的 WebSocket 实现,适用于兼容 Jakarta EE 的容器。Netty 实现:基于高性能网络框架 Netty 自定义开发,灵活性高但开发成本较大本文重点探讨前两种主流方案的实现与实践。
2025-07-18 21:20:26
607
原创 Spring源码之 Bean 的循环依赖
循环依赖是 Spring 中经典问题之一,那么到底什么是循环依赖?简单说就是对象之间相互引用, 如下图所示:代码层面上很好理解,在 bean 创建过程中 class A 和 class B 又经历了怎样的过程呢?可以看出形成了一个闭环,如果想解决这个问题,那么在属性填充时要保证不二次创建 A对象 的步骤,也就是必须保证从容器中能够直接获取到 B。Spring 中默认允许循环依赖的存在,但在 Spring Boot 2.6.x 版本开始默认禁用了循环依赖 重写 customizeBeanFact
2025-07-17 15:39:11
173
原创 3分钟吃透代理技术!
最近有学员问了我一些问题,什么是代理,又该在什么地方使用。结合之前的讨论,这篇文章我们一起细致的讲解一下关于代理的一些问题。两者技术实现是不一样的,具体有什么区别呢?下面我们一起来看看。
2025-07-17 15:37:38
263
原创 SpringBoot 整合 Mail 轻松实现邮件自动推送
发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。最早期的时候我们会使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的过程,在之后 Spring Boot 对此进行了封装就有了现在的 spring-boot-starter-mail ,本章文章的介绍主要来自于此包。
2025-07-17 15:37:06
623
原创 MyBatis-Plus内置的主键生成策略有大坑,要注意!
在软件开发过程中,我们经常会遇到需要生成全局唯一流水号的场景,例如各种流水号和分库分表的分布式主键ID。特别是在使用MySQL数据库时,除了要求流水号具有“全局唯一”性外,还需要具备“递增趋势”,以减少MySQL的数据页分裂,从而降低数据库IO压力并提升服务器性能。因此,在项目中通常需要引入一种算法,能够生成满足“全局唯一”、“递增趋势”和“高性能”要求的数据。关于全局分布式ID的生成,网上有很多相关文章。
2025-07-17 15:36:35
547
原创 go-zero api 调用 rpc 实践
type (A9SumReq {@server (通过 goctl 生成代码:goctl api go --api xxx.api --dir .
2025-07-16 19:35:56
209
原创 go-zero 微服务框架集成 gorm 实操
comment:用户名"`not null;comment:昵称"`type:int;comment:手机号"`comment:密码"`size:4;default:1;comment:状态 1:正常 2:白名单 3:黑名单"`BaseModelcomment:用户id"`接着你就可以拿到 db 在你的业务逻辑进行操作了。注意这里需要先创建相关的数据库。
2025-07-15 20:08:13
239
原创 Java Spring Boot 过滤器的使用与拦截器对比
在 web 应用中,早期在 servlet 中使用 filter过滤器,随着 spring 的发展,不同于依托 servlet容器,拦截器依托 Spring框架 应用也很广泛。
2025-07-15 20:05:25
575
原创 SpringBoot自定义RestTemplate的拦截器链
通过自定义RestTemplate的拦截器链,我们可以将请求处理的通用逻辑(认证、日志、重试等)抽离成独立组件,实现代码复用和统一维护。
2025-07-15 19:37:58
286
原创 SpringBoot中3种条件装配技术
Bean// 配置属性类// JMX监控自动配置@Bean@Bean// Prometheus监控自动配置@Bean@Bean@Bean@Bean// 日志监控自动配置@Bean@Bean# 使用JMX监控(默认)app:type: jmx# 或使用Prometheus监控app:# 或使用日志监控app:type: log# 或完全禁用监控app:条件装配技术核心特点。
2025-07-14 15:09:46
579
原创 SpringBoot中6种跨域请求解决方案
跨域请求是前后端分离开发中不可避免的问题,Spring Boot提供了多种解决方案。从简单的@CrossOrigin注解到复杂的网关配置,我们可以根据项目规模和需求选择合适的方案。在实际开发中,建议综合考虑安全性、灵活性和维护成本,选择最适合项目的CORS解决方案。对于大多数Spring Boot应用,推荐使用全局CORS配置(WebMvcConfigurer)方案,它提供了良好的平衡性;而对于微服务架构,则推荐在网关层统一处理CORS问题,以减少后端服务的配置负担。无论选择哪种方案,
2025-07-14 15:02:53
994
原创 Spring Boot 实现密码安全存储的5种方式
BCrypt内置加盐机制,避免彩虹表攻击。支持设置计算复杂度,可增强哈希强度。哈希结果固定为 60 个字符,方便存储。PBKDF2(Password-Based Key Derivation Function 2)是一种基于密码的密钥派生函数,支持多次迭代计算,进一步增强安全性。Argon2是一种密码哈希算法,2015 年获得密码哈希竞赛(Password Hashing Competition)冠军。它目前被认为是最安全的密码哈希算法之一。SCrypt。
2025-07-14 14:56:01
479
原创 SpringBoot中6种API版本控制策略
通过自定义注解和拦截器/过滤器实现更灵活的版本控制。以上6种API版本控制方式各有优劣,选择时应考虑以下因素项目规模和团队情况:小型项目可选择简单的URL路径版本控制,大型项目可考虑自定义注解或面向接口的方式客户端类型:面向浏览器的API可能更适合URL路径或查询参数版本控制,而面向移动应用或其他服务的API可考虑HTTP头或媒体类型版本控制版本演进策略:是否需要向后兼容,版本更新频率如何API网关与文档:考虑版本控制方式是否便于API网关路由和文档生成最后,版本控制只是手段,不是目的。
2025-07-14 14:47:51
680
原创 SpringBoot实现数据库读写分离的3种方案
这种方案是基于Spring提供的AbstractRoutingDataSource抽象类,通过重写其中的determineCurrentLookupKey()方法来实现数据源的动态切换。// 数据源类型枚举MASTER, // 主库,用于写操作SLAVE // 从库,用于读操作// 数据源上下文持有器@Override在实施读写分离时,需要特别注意数据一致性、事务管理和故障处理等方面的问题。
2025-07-14 14:43:01
1007
原创 Spring Boot 加载配置的6种骚操作,第6种知道的人很少
在Spring Boot应用开发中,随着业务复杂度提升及多环境部署需求的增加,传统硬编码配置方式不仅难以维护,还可能导致环境切换时频繁修改代码,增加部署风险。Spring Boot通过外部化配置机制,允许开发者将配置信息从代码中剥离,集中存储在外部文件或系统中,实现配置与代码解耦。通过该注解同样可以加载类路径下或者磁盘文件中的配置文件,但是通过该注解有一个限制是不能加载yaml格式的文件,需要自定义PropertySourceFactory实现加载逻辑。文件中注册,使用该类的全限定名作为键(key)。
2025-07-11 22:09:04
307
原创 Spring,Spring MVC,Spring Boot 之间什么关系?
Spring MVC是基于Spring的Web开发模块,处理MVC架构。Spring MVC 是 Spring 框架中专门用于 Web 开发的模块(属于Spring Framework的一部分),遵循 MVC(模型-视图-控制器)设计模式,解决 Web 应用的请求处理、路由、视图渲染等问题。Spring Boot 是 Spring 生态的快速开发工具,目标是“简化 Spring 应用的搭建和配置”,核心解决传统 Spring 应用的配置复杂问题(如大量 XML 或 Java 配置、依赖管理繁琐)。
2025-07-11 22:08:23
406
原创 SpringBoot自动装配暗黑纪元:解剖源码,从内核机制到百万级实战
09:15:03 交易系统启动失败,日志报错:No qualifying bean of type 'DataSource' available。
2025-07-11 22:07:52
245
原创 Java,一天一个知识点之:运算符与表达式:算术、比较和逻辑运算
🚀 这个系列就是为你打造的Java「速效救心丸」!✅ 每天1分钟:地铁通勤、午休间隙即可完成学习✅ 直击痛点:只讲高频考点和实际开发中的「坑位」✅ 拒绝臃肿:没有冗长概念堆砌,每篇都有可运行的代码标本:《控制流程:if-else条件语句实战》
2025-07-10 21:16:27
466
原创 Java,一天一个知识点:变量与数据类型:整型、浮点型与字符类型
🚀 这个系列就是为你打造的Java「速效救心丸」!✅ 每天1分钟:地铁通勤、午休间隙即可完成学习✅ 直击痛点:只讲高频考点和实际开发中的「坑位」✅ 拒绝臃肿:没有冗长概念堆砌,每篇都有可运行的代码标本:《运算符与表达式:算术、比较和逻辑运算》
2025-07-10 21:04:45
879
原创 《从头开始学java,一天一个知识点》之:类、方法、主函数
🚀 这个系列就是为你打造的Java「速效救心丸」!✅ 每天1分钟:地铁通勤、午休间隙即可完成学习✅ 直击痛点:只讲高频考点和实际开发中的「坑位」✅ 拒绝臃肿:没有冗长概念堆砌,每篇都有可运行的代码标本:《变量与数据类型:整型、浮点型与字符类型》
2025-07-10 20:54:37
875
原创 Spring Boot Actuator 生产就绪分析与配送场景监控实现
Spring Boot Actuator 提供了健康检测、应用信息暴露和指标监控等功能,是实现生产就绪的核心工具。通过自定义 HealthIndicator,可以监控接口、线程池、内存队列等关键组件;通过 Micrometer,可以实现 Gauge、Counter、Timer 等指标的收集,适用于配送场景的业务监控。结合安全性配置和性能优化,Actuator 能够满足复杂生产环境的需求。
2025-07-09 20:37:23
627
原创 Spring Boot @ConfigurationProperties 详解与 Nacos 配置中心集成
ConfigurationProperties 是 Spring Boot 配置管理的核心工具,支持类型转换、复合类型、数据校验等功能,极大提高了开发效率。在 Nacos 配置中心场景下,结合 @NacosPropertySource 和 @RefreshScope,可以实现动态配置管理,适合分布式系统。通过复杂场景示例和面试追问,读者应能深入理解其原理和实战应用。
2025-07-09 20:27:46
858
原创 工作流与Flowable入门指南:从基础概念到开发环境搭建
*BPMN 2.0(Business Process Model and Notation)**是OMG(对象管理组织)制定的业务流程建模标准,旨在提供统一的图形化符号,便于业务人员和开发人员协作。BPMN 2.0于2011年发布,相较1.x版本,新增了执行语义和元模型,支持流程的存储、交换和自动化执行。BPMN 2.0的核心元素事件(Event):表示流程中的触发点,如开始、结束、定时器等。活动(Activity):表示具体的任务或子流程,如用户任务、服务任务。网关(Gateway)
2025-07-09 20:16:42
712
原创 从技术专家到优秀管理者:架构师的团队领导与系统设计之道
这个方案明明是最优解,为什么团队就是跟不上?许多技术出身的架构师或团队负责人在转型管理时,都会遇到类似的困惑。。技术专家转型管理的常见挑战。为什么“技术强不等于管理强”?管理与技术的本质区别:术与道的结合。两者结合,才能真正玩转复杂平台。本文将从三个维度,帮助技术型管理者补齐“管理短板”,实现从技术专家到团队领袖的跨越。领导软件平台各方面的工作,对技术底蕴、思维模式、决策能力、工作风格、文化铸造等方面都有极高的要求,你可以称之为“领域智慧”。认知盲区的代价是巨大的,的后果更严重,可能导致方向性的错误。
2025-07-08 21:35:12
1190
原创 SpringBoot+Netty 300行代码实现一个简易版的微信群聊功能
在当今的软件开发中,我们经常依赖通用的应用程序或库来实现数据交互。比如,使用HTTP客户端库从Web服务器获取数据,或者通过Web服务执行远程调用,这些都是常见的做法。但是,通用协议并不总是能满足所有需求。想象一下,如果需要处理大文件传输、电子邮件、实时金融信息或多人游戏数据,标准的HTTP服务器就显得力不从心了。这时,我们需要定制化的解决方案,比如为聊天应用优化的Ajax技术、媒体流传输或大文件传输器。甚至,设计一个全新的协议来精确满足特定需求也不失为一种选择。
2025-07-08 21:10:19
531
原创 京东二面:分库分表后翻页100万条,怎么设计?答对这题直接给P7
分库分表后的深度分页,本质是“分布式数据排序”的难题。百万以内数据:二次查询法性价比最高。高并发大厂场景:ES+HBase是唯一选择。千万别硬刚: LIMIT 1000000,10 就是自杀式操作!面试被问分页,先拍桌子喊出“禁止跳页”,再掏出ES,面试官绝对眼前一亮!
2025-07-08 20:58:46
781
原创 面试官问:MySQL 为什么不能用 Docker 部署吗?答错直接挂!
简单说,有状态容器就是:运行过程中必须“记住”数据。比如 MySQL、Redis、消息队列等,这些应用必须确保数据持久、可靠,哪怕容器重启、迁移、甚至崩溃,数据也不能丢。挂载数据卷(Volumes)绑定宿主机路径(Bind Mounts)使用网络存储(如 NFS、云盘)让数据活得比容器久。典型场景:数据库、文件服务器、缓存中间件等。难点:扩容复杂,数据一致性、同步、节点状态都需要严密设计,稍有不慎就会出问题。无状态容器则完全不同:它从来不关心自己的过去。
2025-07-08 20:48:47
991
原创 深入 Java 线程池:核心线程数动态调整技术详解与实战
下面用表格总结一下关于 Java 线程池核心线程数动态调整的要点:要点说明是否支持运行时修改是,ThreadPoolExecutor 支持通过 setCorePoolSize()方法动态修改增加核心线程数的生效时机如队列中有等待任务,会立即创建新线程;否则等新任务到来时创建减少核心线程数的生效时机默认情况下核心线程不会被终止;设置 allowCoreThreadTimeOut(true)后,多余线程在空闲超时后被回收线程池状态影响RUNNING 状态可完全调整;
2025-07-07 21:43:44
560
原创 Java 并发利器:CyclicBarrier 从入门到精通
并行迭代算法:将大任务拆分成多个子任务,每轮迭代结束后同步一次多阶段并行计算:计算分为多个阶段,每个阶段都需要使用上一阶段的结果游戏同步:等待所有玩家加载完成后开始游戏分布式系统中的数据一致性:等待所有节点数据同步后进行下一步操作模拟测试:控制多个线程同时发起请求,测试系统性能特性说明核心功能允许多个线程互相等待,直到所有线程都到达某个点重用性可以被重置并重复使用,适合迭代或周期性任务屏障动作支持在所有线程到达屏障时执行预定义的操作线程安全屏障动作在单线程中执行,天然线程安全。
2025-07-07 21:38:11
831
原创 Redis String 类型的底层实现与性能优化
特性实现方式优势注意事项数据结构SDSO(1)获取长度, 内存安全, 二进制安全根据长度选择不同结构体编码方式自动选择最佳编码,优化性能和内存embstr 修改会转为 raw内存管理预分配+惰性释放减少内存操作,提高性能可能导致暂时内存浪费原子操作命令集+事务+LUA 脚本支持复杂的原子操作,减少竞态条件事务不支持回滚高可用主从+哨兵+集群提高可用性和可扩展性需注意主从一致性延迟应用场景缓存/计数器/分布式锁/位图应用丰富的应用场景支持。
2025-07-07 21:32:46
672
原创 探索 Java SPI 机制:实现灵活插件式架构的必备技术
SPI (Service Provider Interface)是 Java 提供的一种服务发现机制,允许应用程序动态地发现和加载服务实现。简单来说,SPI 提供了一种在运行时发现和加载服务实现类的标准方法,使应用程序可以在不修改现有代码的情况下扩展功能。= null?try {new InputStreamReader(in, StandardCharsets.UTF_8) // 显式指定字符集)) {= null) {
2025-07-06 20:51:49
751
原创 Java 实战:无锁方式实现高性能线程安全单例
实现方式线程安全延迟加载防反射攻击防反序列化性能(百万次/秒)实现复杂度JDK 要求适用场景静态内部类✓✓✗(可添加)✗(需添加方法)30-37低1.2+大多数场景,尤其是需要延迟加载的情况枚举方式✓✗✓✓32-38最低1.5+需要防止反射和序列化攻击的场景CAS 方式✓✓✗✗22-35中1.5+极高并发且对锁敏感的场景双重检查锁✓✓✗✗20-34中1.5+需要延迟加载且初始化过程复杂的场景分布式实现✓视情况✗。
2025-07-06 20:41:22
862
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人