
Spring boot
文章平均质量分 85
spring boot 系列
java干货
人生如逆旅,我亦是行人 微信公众号:java 干货
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
为什么大厂的 API,永远都“刷不爆”?
RateLimit/*** 限流的 Key,支持 SpEL 表达式。* 例如,按用户ID限流: "#userId", 按IP限流: "#request.remoteAddr"*//*** 时间窗口内的最大请求数*//*** 时间窗口大小*//*** 时间单位,默认为秒*//*** 限流后的提示信息*/原创 2025-08-21 22:22:12 · 629 阅读 · 0 评论 -
为什么大厂的 MQ 代码那么干净?秘密就在这个 Starter 里
*** 发送事件/消息* @param exchangeOrTopic 交换机或主题* @param routingKey 路由键* @param payload 消息体 (会被序列化为JSON)*//*** 绑定的交换机 (for RabbitMQ) 或 主题 (for Kafka)*//*** 绑定的路由键 (for RabbitMQ),支持通配符* 例如 "order.created", "user.#"*//*** 消费者队列名称。原创 2025-08-20 15:52:56 · 808 阅读 · 0 评论 -
告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI
在现代 Spring Boot 项目中,SpringDoc OpenAPI 已经不再是一个“锦上添花”的工具,而是保障团队高效协作、提升项目专业度的核心基础设施。原创 2025-08-19 21:20:53 · 1123 阅读 · 0 评论 -
告别 setnx 手动挡!基于 Redisson 的分布式锁 Starter, 才是自动挡的未来
*** 锁的 Key,支持 SpEL 表达式* 例如: "'product:' + #productId"*//*** 尝试获取锁的等待时间,-1 表示一直等待*//*** 锁的租约时间(持有时间),-1 表示使用 Redisson 的看门狗机制(30秒默认,自动续期)*//*** 时间单位,默认为秒*/通过自定义一个 Spring Boot Starter,我们利用 AOP 和 Redisson,将复杂的分布式锁逻辑封装成了一个简单的注解。原创 2025-08-18 21:57:45 · 338 阅读 · 0 评论 -
“完了,手抖多付了一笔钱!” 如何用一个注解,彻底干掉重复支付?
幂等性是数学中的一个概念,指一次或多次执行某操作,都会得到相同的结果。在 HTTP/RESTful API 语境下:•GETPUTDELETE。无论调用多少次,GET获取的资源不变,PUT更新的资源状态不变,DELETE删除的资源结果不变(删除一个已删除的资源,结果依然是“已删除”)。•POST。每次调用POST通常都会创建一个新的资源,两次调用就会创建两个订单。我们的核心目标,就是保护这些非幂等的写操作(主要是POST),防止因重试导致的数据错乱。原创 2025-08-17 19:40:16 · 766 阅读 · 0 评论 -
告别“大海捞针”式查日志:手把手教你打造一个全链路日志追踪 Starter
通过自定义一个 Spring Boot Starter,我们利用Filter、MDC 和客户端拦截器,无侵入地为整个微服务体系注入了全链路日志追踪的能力。这不仅是微服务可观测性(Observability)体系中的重要一环,也是一个能极大提升线上问题排查效率的“基础设施”。原创 2025-08-16 19:40:11 · 851 阅读 · 0 评论 -
告别满屏的 ApiResponse.success()!一个 Starter 让你的 Controller 瞬间清爽
/ 构造函数、Getters、Setters...// ... 其他静态工厂方法,如 error()@Target({ElementType.TYPE, ElementType.METHOD}) // 可用于类或方法通过自定义一个 Spring Boot Starter 和巧妙地利用,我们成功地将重复的 API 响应包装逻辑从业务代码中抽离出来,实现了对开发者透明的、可配置的、统一的响应管理。原创 2025-08-15 16:54:03 · 398 阅读 · 0 评论 -
还在日志里打印“裸奔”的手机号?一行注解搞定 Spring Boot 数据脱敏
通过自定义 Spring Boot Starter,我们成功地将数据脱敏这一“横切关注点”从业务代码中完全剥离。开发者不再需要关心具体的脱敏实现,只需在需要保护的字段上添加一个简单的注解即可。原创 2025-08-14 20:47:42 · 605 阅读 · 0 评论 -
让你的密码“密”不透风:手把手教你写一个属性加密 Spring Boot Starter
通过实现一个自定义的 Spring Boot Starter 和利用扩展点,我们成功地构建了一个轻量级、可复用、对业务代码零侵入的配置加密解决方案。这种方式不仅极大地提升了配置的安全性,避免了在代码仓库中暴露明文密码,还展示了 Spring Boot 自动配置机制的强大威力。掌握这种能力,你将可以为团队封装更多通用的、可插拔的功能,极大地提升开发效率和项目的标准化水平。原创 2025-08-13 21:41:33 · 1337 阅读 · 0 评论 -
还在用PUT更新局部数据?Jakarta REST 4.0 的“合并补丁”,优雅!
然而,我注意到一个日益增长的趋势:越来越多的客户选择 Spring WebMvc 或 WebFlux 作为他们的首选框架,而不是 Jakarta REST。像 JSON Patch 以及这个版本中新引入的 JSON Merge Patch 这样的功能,在真实世界的 RESTful API 开发中很少被使用。, JSON Patch 和 JSON Merge Patch 的完整测试代码,此处为简洁起见,不再重复展示。• 新增了一些便捷的方法来检查请求头的值,特别是那些包含由令牌分隔的列表的请求头,包括。原创 2025-08-12 19:20:00 · 447 阅读 · 0 评论 -
Spring Boot的@Transactional在多线程下竟然“悄悄”失效了!
在本文中,我们将探讨如何在 Spring Boot 中有效地处理事务内的多线程,内容涵盖常见的陷阱、实用的解决方案以及最佳实践。要在 Spring Boot 的事务中处理多线程,你需要确保子线程要么参与父线程的事务,要么适当地管理它们自己的事务。然而,由于数据库连接通常不是线程安全的,你必须确保进行适当的同步,或使用一个可感知事务的执行器。尽可能缩短事务的范围,避免在嵌套事务中产生冲突的锁请求。传播事务上下文、配置可感知事务的执行器,或者为不同线程分配独立的事务,你可以成功应对多线程环境带来的挑战。原创 2025-08-09 20:29:18 · 709 阅读 · 0 评论 -
别再无脑用@Transactional了!这个注解正在悄悄“杀死”你的应用性能!
如果你用一个典型的、包含 10 个连接的连接池,这意味着你每分钟最多只能处理大约 200 个注册请求,而不是你本可以处理的数千个。这个标志会告诉数据库(和驱动)这个事务是只读的,可以进行相应的优化(例如,跳过脏数据检查、路由到读库等)。它现在也成了你数据库事务的一部分,在你等待邮件 API 响应的时候,它一直占着宝贵的数据库连接。在过去一年里,我看过不少的 Spring Boot 的代码库,在几乎每一个项目中,都潜伏着同一个。你的数据库连接不是无限的,你的用户没有耐心,你的性能监控仪表盘也没有对你说谎。原创 2025-08-03 14:47:08 · 909 阅读 · 0 评论 -
一个“豪华酒店”的故事,讲透Spring Bean的5大作用域
作用域singleton(古董摆钟)prototype(全新毛巾)request(送餐车)session(房卡)实例数量一个(全局唯一)多个(每次请求都新建)多个(每个请求一个)多个(每个会话一个)生命周期与容器同生共死创建后由使用者负责与HTTP请求绑定与HTTP会话绑定核心比喻酒店大堂的公共设施一次性的个人卫生用品一次送餐的专属服务一次入住的身份凭证一句话总结大家共用一个每次都给你新的每次请求给你新的每次会话给你新的singleton。原创 2025-08-01 15:20:15 · 513 阅读 · 0 评论 -
别再只会@Autowired了!这10个Spring Boot高级技巧,才是拉开差距的关键!
一个 Spring Boot Starter 本质上就是一个普通的 Maven 模块,加上一个(可选的)自动配置模块。你可以创建一个 Starter 来打包那些在你的多个项目中通用的依赖、配置和工具类。如果你以为自己已经把 Spring Boot 玩得滚瓜烂熟,这篇文章将挑战你的认知——并在此过程中让你成为一名更优秀的后端开发者。才注册一个 Bean——比如,当某个配置属性被设置了,或者应用的类路径(classpath)下存在某个特定的类时。,但它被低估和未被充分利用的程度令人震惊。原创 2025-07-27 17:24:04 · 929 阅读 · 0 评论 -
为什么我的 @Async 不生效?很多人都栽在这个坑里
默认情况下,Spring Boot 会创建一个来处理异步方法。这个执行器不会重用线程,每次调用都会创建一个新线程,在高并发下可能导致资源耗尽。在生产环境中,我们必须配置一个自定义的线程池来更好地管理资源。创建一个类型的 Bean。@Bean("myTaskExecutor") // 定义一个名为 myTaskExecutor 的线程池 Bean// 核心线程数// 最大线程数// 任务队列容量// 线程名前缀在@Async注解中指定线程池 Bean 的名称。@Service。原创 2025-07-24 18:50:46 · 1432 阅读 · 0 评论 -
Spring Boot DTO校验终极教程!从入门到嵌套,一篇搞定!
• 对于需要同时校验多个字段之间关系的复杂逻辑(例如,“当 A 字段为某个值时,B 字段不能为空”),应实现。以上内容涵盖了 Spring Boot 中 DTO 校验的基础、自定义和嵌套场景的核心要点。• 自定义验证器如果需要访问整个对象(而不仅仅是单个字段),可以通过实现。• 对于集合,不仅要在集合字段本身上使用校验注解(如。这是一种更常用、更优雅的处理校验失败的方式。在 Controller 的方法参数上使用。),以确保集合内的每个元素都被校验。• 对嵌套对象进行校验时,原创 2025-07-22 19:26:53 · 216 阅读 · 0 评论 -
还在用e.printStackTrace()?求求了,别再写这种无效日志了!
我们有了结构化日志、集中式可观测性,还有运行在上百个节点上的云原生应用。记录那些可恢复的、但可能需要关注和监控的问题(例如,“配置项即将过期”,“重试了 3 次后成功”)。记录系统正常运行时的预期流程和重要的状态变更(例如,“用户登录成功”,“订单创建完毕”)。在凌晨 3 点的生产事故中,像“失败了”或“发生异常”这样的日志对你毫无帮助。= 更整洁的代码、一致的错误响应、以及更少的重复代码。3. 你的日志里的噪音直接翻倍,给问题排查带来困扰。,它们是你和运维团队(或者未来的你)之间的。原创 2025-07-21 17:08:20 · 761 阅读 · 0 评论 -
还在用@Cacheable?你可能只发挥了Spring Boot缓存10%的功力!
有时候,你的方法参数非常复杂,默认的对象哈希值可能无法满足你的需求(比如,两个不同的对象实例内容相同,你希望它们命中同一个缓存)。,在数据发生变更(例如,通过某个管理后台更新了产品信息)时,发布一个事件,然后由一个监听器来异步地触发缓存的重新填充。——除非绝对必要(比如,批量导入数据导致大量缓存失效),否则不要一下子清空整个缓存,这可能会导致“缓存雪崩”。当数据被更新时,这个注解会清除缓存中指定的键对应的数据,确保下次请求能获取到最新的数据。缓存是好东西,直到你更新了数据,而你的缓存还在返回过时的旧结果。原创 2025-07-20 15:29:32 · 735 阅读 · 0 评论 -
如何一行配置,就让系统在 MySQL 和 PG 之间无缝切换?
想象一下你去宜家(一个抽象工厂)购买家具,你选择“北欧简约风”(一个具体工厂),那么这家店里提供的所有沙发、桌子、椅子(一系列产品)都会是相互兼容、风格统一的北欧风。理解抽象工厂模式的精髓,并将其作为你架构设计工具箱中的“王牌”,是每一位致力于构建大型、可移植、多平台应用的开发者的必备素养。增加一个新的产品家族(如Linux主题)非常容易,只需创建一个新的具体工厂和一系列新的具体产品即可,无需修改现有代码。由于一个具体工厂只生产一个产品族的产品,所以可以保证客户端使用的对象都是相互匹配、协同工作的。原创 2025-07-16 16:23:43 · 1083 阅读 · 0 评论 -
别再用 new 了,Lombok 的 @Builder 原来是这么回事!
在 Spring Boot 中,当你需要构建复杂的DTO、领域对象或配置对象时,建造者模式能提供一种极其优雅、可读性极强的流式API(Fluent API),让你的对象创建代码如行云流水。本文将探讨为什么冗长的构造函数会损害你的代码库,通过一个实际的披萨制作示例来展示建造者模式的强大威力,并一步步指导你如何在 Spring Boot 中运用其思想 —— 让我们今天就开始解锁更优雅的对象构建之道吧!理解建造者模式的精髓,并将其作为你代码工具箱中的一员,是每一位追求代码整洁和优雅的开发者的必备素养。原创 2025-07-15 16:39:44 · 1184 阅读 · 0 评论 -
6个服务互相调用怎么办?别慌,引入一个“总指挥”就够了
本文将探讨为什么混乱的对象交互会损害你的代码库,通过一个实际的登录对话框示例来展示中介者模式的强大威力,并一步步指导你如何在 Spring Boot 中实现它 —— 让我们今天就开始解锁更优雅的系统协作之道吧!它通过引入一个中心的“协调员”,将对象间复杂的交互逻辑集中管理,从而极大地降低了系统的耦合度,使得各个组件更加独立和易于复用。想象一下机场的塔台(中介者),所有飞机(同事对象)的起飞和降落都无需互相通信,只需听从塔台的统一指挥即可,大大降低了空中交通的复杂性和风险。每个同事对象都知道自己的中介者。原创 2025-07-14 15:43:14 · 476 阅读 · 0 评论 -
想自己写个“规则引擎”?你得先学会解释器模式
在 Spring Boot 中,当你需要构建一个自定义的迷你查询语言、规则引擎或配置解析器时,解释器模式能帮你创建出结构清晰、易于扩展的系统,把你的特定领域语言(DSL)处理逻辑变成一个优雅的对象树。简单来说,就是把一个“句子”(如查询字符串)转换成一个树形结构的对象,树上的每个节点都代表一个语法元素(如操作数、操作符),然后调用树根节点的“解释”方法,就能得到整个句子的执行结果。当需要给语言增加新的规则(例如,增加一个新的操作符)时,通常只需要增加一个新的表达式类即可,符合开闭原则。一个组合模式的实例。原创 2025-07-13 15:52:25 · 621 阅读 · 0 评论 -
为什么一个 @Transactional 注解就能开启事务?揭秘 Spring AOP 的底层魔法
等神奇注解的底层秘密。本文将探讨为什么直接访问对象会带来问题,通过一个实际的权限校验示例来展示代理模式的强大威力,并一步步揭示它在 Spring Boot 中的核心地位 —— 让我们今天就开始解锁 Spring AOP 的底层魔法吧!Spring AOP 通过动态代理技术,将开发者从繁琐的事务管理、日志记录等横切关注点中解放出来,让我们只需一个简单的注解,就能享受到代理模式带来的巨大威力。App就是餐厅的代理。• 当你想在不修改对象代码的前提下,为其增加一些通用的、横切性的功能时(如日志、事务、缓存)。原创 2025-07-12 14:42:43 · 503 阅读 · 0 评论 -
读取QPS 10万,写入QPS 1000,如何设计系统架构?
本文将探讨为什么“一个模型走天下”的传统CRUD会成为瓶颈,通过一个实际的电商商品服务示例来展示CQRS的强大威力,并一步步指导你如何在 Spring Boot 中实现它 —— 让我们今天就开始解锁更高级的系统架构之道吧!这是一种高级的架构模式,它将系统的数据更新操作(命令)和数据读取操作(查询)彻底分离,让它们可以使用各自最优的模型和技术栈。用于处理所有的数据创建、更新和删除操作。CQRS 的查询端(读模型)可以完美地通过监听事件溯源产生的事件流,来构建和维护自己所需的、高度优化的数据视图。原创 2025-07-11 12:00:01 · 456 阅读 · 0 评论 -
这才是高级Java该有的测试!用@Nested让你的JUnit测试可读性飙升
在测试服务类(Service Class)时,你可能需要编写大量的测试方法,以确保单个业务方法的所有场景都被恰当地覆盖。好消息是,JUnit 5 提供了一种简单的方法来组织这些测试方法,能让你的测试类变得更易于阅读和维护。你会注意到,这些方法内部包含许多逻辑分支,每个分支都需要一个独立的测试方法来确保完全覆盖。• 每个嵌套类中包含多个测试用例,覆盖了对应方法的多个逻辑分支,以确保全面的测试覆盖率。,清晰地显示在两个嵌套的测试组下,这使得理解哪个测试方法覆盖了哪个方法的哪种场景变得。• 检查用户是否存在。原创 2025-07-09 20:25:59 · 172 阅读 · 0 评论 -
再见,WebSecurityConfigurerAdapter!你好,SecurityFilterChain
不再需要。Spring Security 会自动发现并使用我们定义的和Bean。•现代示例代码@Bean// 以内存用户为例.build();@Bean任务旧方式 (新方式 (Component-based Beans)HTTP 安全配置覆盖定义Bean用户认证配置覆盖定义和Bean忽略静态资源覆盖定义Bean。原创 2025-07-06 17:42:40 · 1100 阅读 · 0 评论 -
架构师的“降维打击”:用桥接模式,把 N*M 的问题变成 N+M
你是否也曾深陷在多维度变化的泥潭,当一个类有两个或多个独立变化的维度(如形状和颜色),你不得不为每一种组合都创建一个子类(红色的圆形、蓝色的圆形、红色的方形…它通过将“做什么”(抽象)和“怎么做”(实现)分离到两个独立的继承体系中,并用一座“桥”将它们连接起来,从根本上解决了因多维组合而导致的“类爆炸”问题。通过这种方式,客户端只与“抽象部分”交互,而“抽象部分”通过一座“桥梁”来调用“实现部分”的功能,二者可以独立演化。• 对于非常简单的系统,引入该模式会增加额外的接口和类,提高系统的复杂性。原创 2025-07-03 14:33:49 · 1104 阅读 · 0 评论 -
如何优雅地实现“撤销/重做”功能?Ctrl+Z 的秘密原来是它
它能将“请求的发起者”与“请求的执行者”彻底解耦,把你的业务操作变成一个个可传递、可存储、可执行的独立“命令包”。本文将探讨为什么紧耦合的调用会损害你的系统,通过一个实际的智能家居遥控器示例来展示命令模式的强大威力,并一步步指导你如何在 Spring Boot 中实现它 —— 让我们今天就开始解锁更灵活的请求处理之道吧!理解命令模式的精髓,并掌握其在 Spring Boot 中的现代化应用,是每一位致力于构建复杂、高性能、高弹性系统的开发者的核心能力。命令对象通常是一次性的,执行完(或撤销完)就结束了。原创 2025-07-02 18:49:08 · 902 阅读 · 0 评论 -
创建100万个对象,内存才占1M?享元模式,YYDS!
在现代化的 Spring Boot 开发中,虽然我们不常直接从头实现享元模式,但其“共享复用”的核心思想无处不在——从默认的单例Bean,到数据库连接池,再到各种缓存技术。享元设计模式是性能优化工具箱中的一把锋利的手术刀。它通过巧妙地分离和共享对象状态,以空间换时间,极大地减少了内存消耗和对象创建的开销,使得应用程序能够支持海量细粒度对象的场景。你是否也曾深陷在海量对象创建的性能泥潭,当你的应用需要渲染成千上万个相似的粒子、文字或图标时,瞬间飙升的内存占用和频繁的GC(垃圾回收)让系统不堪重负,甚至直接。原创 2025-07-01 18:48:42 · 614 阅读 · 0 评论 -
一个 new 操作耗时1秒?用原型模式,性能提升100倍!
本文将探讨为什么昂贵的对象创建会成为系统瓶颈,通过一个实际的游戏对象复制示例来展示原型模式的强大威力,并一步步指导你如何在 Spring Boot 中运用其思想 —— 让我们今天就开始解锁更高效的对象创建之道吧!理解原型模式的克隆思想,并掌握 Spring 中原型作用域的正确用法,是每一位致力于构建高性能、高弹性应用的开发者的必备技能。只复制对象本身和其中的基本类型变量,而对象内的引用类型变量,复制的只是引用的地址。原型模式的核心思想是:**用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原创 2025-06-30 15:13:24 · 869 阅读 · 0 评论 -
别再 new 子类了!用装饰器模式,给你的代码“加Buff”
装饰器模式,又称“包装器”(Wrapper),其核心思想是:**在不改变原有对象接口的前提下,动态地给一个对象添加一些额外的职责。它通过一种优雅的“包装”机制,使得我们可以在不修改现有代码的基础上,像搭积木一样为对象层层添加新的职责,完美地遵循了开闭原则。你是否也曾深陷在各种功能组合的泥潭,为了给一个对象增加几个可选的特性(如加牛奶、加糖的咖啡),而被迫创建大量的子类,导致类数量爆炸,难以维护?你可以轻松地添加新的功能(新的装饰器类),而完全无需修改现有的代码(被装饰的类),扩展性极强。原创 2025-06-29 20:32:21 · 630 阅读 · 0 评论 -
“这第三方接口太奇葩了!” 别慌,用适配器模式盘它!
在 Spring Boot 的场景下,适配器通常就是一个普通的 Spring Bean,它优雅地封装了所有的转换逻辑,让外部系统无缝地融入到我们的应用中。你是否也曾深陷在系统集成的泥潭,面对一个功能强大但接口“奇葩”的第三方库,或者一个陈旧但无法替换的遗留模块,让你不得不修改大量现有代码来将就它?客户端代码只依赖于标准的目标接口,完全不知道背后实际干活的“被适配者”是谁,它的接口有多么“古怪”。这是一种结构型设计模式,它能作为两个不兼容接口之间的桥梁,使得因接口不兼容而不能在一起工作的那些类可以协同工作。原创 2025-06-27 19:57:14 · 906 阅读 · 0 评论 -
从“待支付”到“已完成”,如何优雅地管理订单的“一生”?
在 Spring Boot 中,这种模式与面向对象思想和依赖注入机制深度结合,能够创建出职责清晰、状态转换明确且易于扩展的“状态机”,把你的复杂业务对象生命周期管理变成一个优雅的艺术品。本文将探讨为什么滥用条件判断来管理状态会损害你的代码库,通过一个实际的订单流转示例来展示状态模式的强大威力,并一步步指导你如何在 Spring Boot 中实现它 —— 让我们今天就开始解锁更优雅的状态管理吧!当需要增加一个新的状态时,只需添加一个新的状态实现类即可,无需修改现有状态类和上下文类的代码,完美符合开闭原则。原创 2025-06-26 15:10:36 · 1287 阅读 · 0 评论 -
连“双重分派”都不知道,还敢说是高级 Java 开发工程师?
在 Spring Boot 中,这种模式的思想能帮助我们构建出极其灵活和可扩展的系统,特别是当处理复杂的、由多种不同部分组成的对象集合时(如文档、报表、抽象语法树等)。在面对一个稳定的、由多种节点构成的复杂对象世界时,访问者模式就像一个多才多艺的“旅行者”,可以带着不同的“目的”(操作)去“拜访”每一个节点,并完成任务。尽管它在应对数据结构变化时显得脆弱,但在正确的场景下,它能够极大地提升系统的扩展性和可维护性,是每一位追求优雅架构的开发者兵器库中不可或缺的一件利器。它通过巧妙的“双重分派”机制,实现了。原创 2025-06-25 16:22:19 · 1061 阅读 · 0 评论 -
为什么大佬的代码中几乎看不到 if-else,因为他们都用这个...
在 Spring Boot 中,这种模式与面向切面编程(AOP)和依赖注入的思想不谋而合,能够创建出职责清晰、高度解耦且易于扩展的“处理流水线”,把你的复杂逻辑拆分成一个个独立的关卡。本文将探讨为什么臃肿的过程代码会损害你的代码库,通过一个实际的用户请求处理示例来展示责任链模式的强大威力,并一步步指导你如何在 Spring Boot 中实现它 —— 让我们今天就开始解锁更优雅的流程控制吧!将一个复杂的、线性的处理流程,拆解成一系列独立的、可插拔的步骤,使得整个业务流程一目了然。原创 2025-06-23 18:48:21 · 815 阅读 · 0 评论 -
还在 Service 里疯狂注入其他 Service?你早就该用 Spring 的事件机制了
在 Spring Boot 中,这种模式的思想被其内置的事件驱动机制(Event-Driven Mechanism)发扬光大,能够创建出高度解耦、响应灵敏且易于扩展的系统,把你的业务通知流程变成一个优雅的广播系统。本文将探讨为什么紧耦合的通知方式会损害你的代码库,通过一个实际的下单后多任务处理示例来展示观察者模式的强大威力,并一步步指导你如何在 Spring Boot 中实现它 —— 让我们今天就开始解锁更优雅的模块间通信吧!传统观察者模式中,主题通常需要维护一个观察者的列表,存在一定关联。原创 2025-06-24 17:09:31 · 566 阅读 · 0 评论 -
Spring系列四:Bean Scopes作用域
等闲识得东风面,万紫千红总是春。概述在Spring框架中,我们可以在六个内置的spring bean作用域中创建bean,还可以定义bean范围。在这六个范围中,只有在使用支持Web的applicationContext时,其中四个可用。singleton和prototype作用域可用于任何类型的ioc容器。Spring Bean作用域类型在Spring中,可以使用spring中的 ...原创 2019-10-21 10:15:59 · 240 阅读 · 0 评论 -
Spring系列三:IoC 与 DI
水晶帘动微风起,满架蔷薇一院香。概述在软件工程中,控制反转(IoC)是一种设计思想,对象之间耦合在一起,在运行时自动绑定,并且它们编译时对所需要引用的对象是不确定的。在这个spring教程中,通过示例了解ioc和spring中的依赖注入之间的区别。什么是控制反转(IOC)在传统面向对象设计的软件系统中,它的底层由N多个对象构成,各个对象之间通过相互合作。最终实现业务流程。控制反转意指...原创 2019-10-18 15:54:18 · 155 阅读 · 0 评论 -
Spring系列二:IoC 容器
还君明珠双泪垂,恨不相逢未嫁时。概述Spring IoC容器是Spring框架的核心。只需要进行简单的容器配置,就可以将创建对象,使用对象,销毁对象联系在一起,从而管理从创建对象到销毁对象的整个生命周期。Spring容器使用依赖项注入(DI)来管理组成应用程序的组件。Spring提供以下两种类型的容器。BeanFactory 容器ApplicationContext 容器Be...原创 2019-10-18 15:52:21 · 174 阅读 · 0 评论 -
Elastic-Job:动态添加任务,支持动态分片
多情只有春庭月,犹为离人照落花。![https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/java/java08.jpg](https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master...原创 2019-09-19 14:23:11 · 1321 阅读 · 0 评论