- 博客(53)
- 资源 (6)
- 收藏
- 关注
原创 深入理解Java volatile关键字
以下内容均摘自 《Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide, Part 1》2.8.5 Controlling the Processor…The LOCK prefix invokes a locked (atomic) read-modify-write operation when modifying a memory operand. T
2020-07-25 14:26:02
2015
2
原创 掌握 Cursor:AI辅助开发战略指南
Cursor 并非简单地在 Visual Studio Code 中加入了 AI 功能的复刻版 1,它是一个“AI 原生”的代码编辑器,其设计初衷就是为了从根本上重塑软件开发的工作流 3。在这种新范式下,开发者的核心角色正发生深刻转变:从一个逐行编写代码的作者,演变为一个指导、规划和审查AI 生成工作的导演4。“聪明的实习生”心智模型这是成功使用 Cursor 最关键的心智模型。开发者应将 AI 视为一个编码速度极快、知识渊博但完全缺乏业务背景、架构意识和常识的“实习生” 5。
2025-10-26 13:00:58
756
原创 LLM的沟通指南:一份全面的Prompt Engineering教程
在人与人工智能(AI)协作的时代,Prompt Engineering(提示工程)已不仅仅是一种小众技巧,而是驾驭大型语言模型(LLM)的核心准则 1。它是一门艺术,也是一门科学,专注于设计和优化输入指令(即“Prompt”),以引导AI模型精准地生成期望的输出 2。我们可以将其比作电影导演与演员的合作。一位优秀的导演不会简单地对演员说“开始表演”,而是会提供详尽的剧本、角色背景、情感动机和具体的动作指导。
2025-10-26 12:38:50
658
原创 从抽象到实现:Elasticsearch数据类型及其底层Lucene数据结构的深度解析
Elasticsearch的强大功能根植于其核心——Apache Lucene,一个高性能、功能完备的搜索引擎库 1。要深入理解Elasticsearch如何处理各种数据类型,首先必须剖析构成Lucene索引的三个基本数据结构:倒排索引(Inverted Index)、列式存储(Doc Values)和BKD树(BKD Tree)。这三大支柱各自针对不同的访问模式进行了极致优化,它们的协同工作构成了现代搜索引擎的基石。倒排索引是Lucene乃至所有现代搜索引擎实现快速全文检索的核心数据结构 2。其基本思想与
2025-09-07 16:26:01
1125
原创 Elasticsearch中的数据生命周期:持久性、可见性与一致性权威指南
当段的数量过多时,搜索性能会下降,因为每次搜索都必须查询每一个段。然而,合并过程本身是资源密集型的,会消耗大量的 CPU 和磁盘 I/O,这会与索引操作竞争资源,从而拖慢索引速度 2。对这一深度机制的理解,使架构师和开发者能够超越默认设置,通过对索引速度、数据持久性和搜索延迟之间的权衡做出有意识、明智的决策,从而在 Elasticsearch 上构建出复杂、高性能且可靠的系统。是一个将当前保留在内存索引缓冲区中的文档写入到一个新的、不可变的磁盘文件系统缓存中的 Lucene 段的过程 2。
2025-09-07 15:36:29
1060
原创 深入剖析Spring Boot启动流程
通过本次深入的探索之旅,我们系统地解构了Spring Boot从一个简单的main方法调用,到成为一个功能完备、随时可以提供服务的应用程序的全过程。现在,那层曾经看似神秘的“魔法”面纱已经被揭开,展现在我们面前的是一个逻辑严谨、层次分明且高度可扩展的工程杰作。引导与准备(:一切始于的实例化和run()方法的调用。在这个阶段,框架完成了环境的探测(Web应用类型)、早期扩展点的加载(通过或.imports文件)、以及配置属性的分层加载,为后续的创建搭建了稳固的舞台。容器构建(
2025-09-06 14:32:41
1216
原创 深入剖析Spring Boot自动配置原理
理解了自动配置的全部原理后,就来到了应用的最高境界:不再仅仅是使用和定制,而是为其生态系统贡献新的构件——创建自定义的Starter。自定义Starter可以将通用的配置、Bean和功能逻辑封装成一个可重用的模块,极大地提升团队开发效率和项目一致性 66。在企业环境中,自定义Starter更是推行架构标准和最佳实践的利器。例如,可以创建一个“公司内部基础Starter”,它自动配置好符合公司规范的日志系统(如集成ELK)、监控指标(集成Prometheus)、分布式追踪以及统一的认证授权逻辑。
2025-09-06 08:37:17
998
原创 Spring Bean生命周期的完全指南
Bean一个常见的误解是,Spring Bean是一种特殊的Java类。实际上,任何一个由Spring IoC容器实例化、组装和管理的对象,都可以被称为Spring Bean6。它本质上就是一个普通的Java对象(POJO)。容器通过读取**配置元数据(Configuration Metadata)**来了解应该创建哪些对象、如何创建以及它们之间的依赖关系。这份元数据就像是创建Bean的“蓝图”或“配方” 7。基于注解的配置:在类上使用@Component@Service或。
2025-09-01 22:33:57
786
原创 深度解析Java synchronized关键字及其底层实现原理
JVM首先押注:“这个锁很可能只会被一个线程使用”,这就是偏向锁,其回报是后续加锁的极高效率,而押注失败的代价是昂贵的偏向撤销。如果这个赌注失败,JVM会进行第二个赌注:“即使有竞争,也很可能是短暂的”,这就是轻量级锁与自适应自旋,其回报是避免了操作系统层面的线程上下文切换,代价是自旋时消耗的CPU周期。然后,JVM会遍历该线程的栈帧,找到与此对象相关的锁记录,并将对象的Mark Word恢复到无锁或轻量级锁的状态,之后才允许发起竞争的线程继续尝试获取锁 43。的工作原理,也揭示了其性能的演变。
2025-08-16 22:44:03
918
原创 解构魔法:深入剖析MapStruct底层原理
这种编译时代码生成的架构是MapStruct设计哲学的核心体现,它做出了一个明确的权衡:用编译时的严谨性、高性能和快速反馈,换取了运行时动态映射的灵活性。分析表明,这一选择为现代Java应用开发带来了显著的优势,包括卓越的性能、强大的类型安全保障、简化的调试过程以及零运行时的轻量级特性。这并非MapStruct的私有技术,而是Java平台标准的一部分,它将Java编译器从一个封闭的黑盒转变为一个可插拔、可扩展的框架。在编译阶段,它解析您定义的映射接口,并自动生成具体、高效、类型安全的Java实现类 9。
2025-08-16 09:55:36
825
原创 MapStruct 是浅拷贝还是深拷贝?
在某些情况下,标准的注解驱动映射可能无法满足复杂的业务需求。例如,克隆过程中可能需要执行一些计算、调用外部服务,或者处理一些非标准的 getter/setter。对于这些场景,MapStruct 提供了强大的扩展机制:在 mapper 接口中实现default方法 8。当 MapStruct 在生成代码时,如果发现一个映射任务(例如,从Address映射到Address)已经有一个匹配的default方法实现,它会优先调用这个手写的方法,而不是自己生成实现 19。这给予了开发者对拷贝过程的最终控制权。
2025-08-16 08:56:47
1273
原创 三阶段提交(3PC)协议的全面解析:理论、机制与实践局限性
协调者(Coordinator):作为主控进程,负责驱动整个事务协议的流程 8。状态集Initial(初始)、Waiting(等待投票)、PreCommit(预提交)、Committed(已提交)、Aborted(已中止)。参与者(Participant):作为从属进程,负责执行事务的本地部分,并根据协调者的指令行动 8。状态集Initial(初始)、Waiting(或Ready,已投票等待)、PreCommit(预提交)、Committed(已提交)、Aborted(已中止)8。
2025-08-09 17:02:22
1022
原创 DDD Repository模式权威指南:从理论到Java实践
根据Martin Fowler和Eric Evans的经典定义,Repository模式“作为领域层和数据映射层之间的中介,其行为类似于一个内存中的领域对象集合” 3。它的核心意图是封装被持久化的对象集合以及对这些对象执行的操作,从而为持久化层提供一个更加面向对象的视图 1。持久化抽象 (Abstraction of Persistence):首要目标是将底层的持久化技术(如SQL、NoSQL数据库或ORM框架)对领域模型隐藏起来。
2025-08-02 10:44:49
844
原创 DDD的守护者:Factory模式深度解析与实战
只有当创建的复杂性——无论是源于内部逻辑的增长,还是外部依赖的引入——真正成为一个问题时,才将它重构为一个独立的、可注入依赖的工厂服务。当系统需要引入新的产品类型时,只需添加一个新的具体产品类和一个对应的具体创建者子类,而无需修改任何现有的客户端代码。我们探讨了它的核心职责、两种主流实现方式,并通过一个详尽的案例展示了其在真实世界中的应用,最后还阐明了它与其他模式的协作关系和设计最佳实践。不变量(Invariant)是DDD中的一个核心概念,它指的是在任何时候都必须为真(保持一致)的业务规则或条件 15。
2025-08-02 10:41:49
1039
原创 边界的艺术:DDD聚合设计的深度探索
最出色的设计者,是那些深刻理解规则的人,他们知道何时遵循规则,更重要的是,他们知道何时可以打破规则,并能为自己的每一次“破戒”提供坚实的、源于领域的合理解释 12。这个失败的根源在于,设计者围绕着“伪不变量”(由开发者强加的、而非业务驱动的约束)构建了聚合,导致了不必要的事务冲突。“正确”的设计是在不断的学习和重构中演进而来的。设计的起点是识别出核心的业务规则:“当一个待办事项(BacklogItem)下的所有任务(Task)的剩余工时都为零时,该待办事项的状态自动变更为‘完成’(Done)” 12。
2025-08-02 09:57:09
823
原创 DDD中的核心权衡:模型纯度与逻辑完整性
为了进行有意义的讨论,我们必须首先为“纯度”和“完整性”建立严谨且无歧义的定义。这需要我们超越表面的、简单的理解,为后续的深入分析奠定坚实的基础。
2025-07-30 20:58:52
871
原创 DDD实战:从需求到代码,一步步构建电商订单系统
划分好限界上下文(我们帝国的各个行省)之后,我们必须明确它们之间是如何协作和通信的。**上下文映射图(Context Map)**就是这样一张描绘上下文之间“外交关系”的地图 20。清晰地定义这些关系,对于避免构建出“分布式单体”——即每个服务都紧密依赖其他服务,无法独立部署和演进——至关重要 9。模式上游上下文下游上下文关系描述具体电商示例客户-供应商 (Customer-Supplier)库存上下文订单上下文。
2025-07-30 20:55:36
598
原创 架构师的罗盘:一份利用DDD驾驭复杂性的入门指南
在 DDD 的所有模式中,限界上下文(Bounded Context)无疑是至关重要且最具变革性的一个。它是一个“语义的上下文边界”,在这个边界之内,通用语言具有唯一、明确的含义,领域模型也受到保护,免受外部概念的侵扰和污染。它就像一个“魔法圈”,圈内的一切都遵循着统一的法则。要理解限界上下文的威力,最好的方式莫过于思考“客户”(Customer)这个词。在一个庞大的企业中,这个词的含义远非统一。
2025-07-29 09:25:03
619
原创 从理论到实践:DDD落地挑战与解决方案综合分析
问题描述将一个庞大、复杂的业务领域分解为一组内聚、明确的限界上下文,是一项极具挑战性的任务。团队常常在“如何划线”上挣扎,导致划分出的上下文要么过大(依然是小泥球),要么过小(增加了不必要的集成复杂性),或者内聚性差。深度分析限界上下文是DDD的核心模式,它提供了一个明确的语言和模型边界。在这个边界内,特定的领域模型是统一且无歧义的 5。例如,“订单”这个概念,在“销售”上下文中可能关注价格和客户信息,而在“仓储”上下文中则更关注库存和配送状态 9。
2025-07-29 09:20:43
972
原创 DDD领域事件深度解析:从理论到Java实战
在领域驱动设计的语境中,领域事件被定义为**“在领域中发生、且值得关注的过去之事”** 1。它不是一个执行某项操作的命令(Command),而是一个关于状态变更已经发生这一事实的不可变记录 4。这个概念是 DDD 核心目标的直接体现:创建能够精确反映其所服务的业务领域的软件 1。事件使用**通用语言(Ubiquitous Language)**进行命名,这使得系统的行为变得明确,并且能够被开发人员和领域专家共同理解 3。
2025-07-29 09:18:23
1291
原创 边界的艺术:DDD聚合的识别与划分指南
根据领域驱动设计的开创者Eric Evans的定义,聚合是“一组我们为了数据变更而将其视为一个单元的相关对象的集群” 3。关联性和单元性。然而,为了真正理解聚合,我们必须超越这个字面定义。一个简单的对象图(Object Graph):聚合的设计动机并非为了方便地在对象间导航,而是为了维护一致性 3。一个普通的集合类(Collection Class):DDD聚合代表的是领域概念(如订单、门诊记录),而集合是通用的数据结构 7。一个数据传输对象(DTO)
2025-07-29 09:15:38
1428
原创 DDD聚合模式深度解析:从理论到实践的权威指南
聚合(Aggregate)是领域驱动设计中的一个核心模式,它指的是一组被视为单一单元的相关领域对象的集群 1。这个模式的根本目标是管理业务复杂性并确保数据的完整性与一致性 3。聚合最关键的概念是它定义了一个一致性边界在这个边界内部,所有业务规则,即不变性(Invariants),必须在任何事务结束时都得到完全满足 4。例如,一个“订单”聚合可能包含“订单”本身和多个“订单项”。一个核心不变性可能是“订单的总价必须等于所有订单项价格的总和”。
2025-07-28 23:07:55
764
原创 微服务拆分之术与道:从原则到实践的深度解析
本报告从“道”与“术”两个层面,系统地剖析了微服务拆分的原则与实践。我们明确了“高内聚、低耦合”是永恒的北极星,而“康威定律”揭示了架构与组织之间不可分割的联系。我们详细探讨了以DDD为核心的、从业务出发的拆分模式,学习了事件风暴这一强大的协作探索工具,并掌握了“绞杀者模式”这一优雅迁移遗留系统的实用策略。同时,我们也深入分析了“分布式单体”和“共享数据库”等致命的陷阱,并理解了数据拆分所带来的一系列连锁挑战。
2025-06-22 10:06:06
1300
原创 微服务江湖的爱恨情仇:Spring Cloud 与 Kubernetes 的双雄演义
但这种与应用代码和 Java 语言的深度绑定,也带来了两个致命的弱点:首先,它违背了微服务架构所倡导的“技术异构性”(Polyglot)原则,一个用 Python 或 Go 编写的服务无法轻易享用这套 Java 体系的治理能力。当对下游服务的调用连续失败或响应过慢时,“保险丝”(断路器)会自动“熔断”,在一段时间内阻止后续请求,并可以执行一个预设的“后备方案”(Fallback),从而避免了灾难性的连锁失败,保证了系统的整体韧性。然而,这种“侵入式”的爱,既是它最大的优点,也为其日后的困境埋下了伏笔。
2025-06-22 09:55:16
1052
原创 vscode+docker搭建linux c开发环境
步骤如下:第1步、构建自定义的docker镜像。Dockerfile如下:FROM ubuntu:18.04# 替换为阿里云镜像,如不需要可以去掉本部分RUN printf '\n\deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted uni
2022-05-15 14:49:00
1646
原创 draw.io使用技巧
本文的使用技巧总结自 draw.io 官方的 YouTube频道 以及 交互式教程。一、常用快捷键以下为mac系统的快捷键,windows系统需要将option替换为altresize时:按住ctrl 或 ctrl + shift 可以保持图形中心不变option + shift + 箭头:在当前图形的上/下/左/右快速创建图形复制形状:按住cmd鼠标拖动形状替换形状:选中形状 —> 按住shift —> 左侧点选目标形状二、高级特性1、插入 —> 布局只需点
2022-05-11 21:10:47
13246
1
原创 docker-compose搭建kafka集群
version: '2'services: zoo1: image: bitnami/zookeeper:3.7 container_name: zoo1 restart: always hostname: zoo1 ports: - "2181:2181" volumes: - ./zoo1/data:/bitnami/zookeeper - ./zoo1/log:/opt/bitnami/zookeeper/lo
2022-03-10 20:19:48
3434
原创 Mac Docker Failed to ping backend API 错误解决
解决步骤如下:Command + 空格,搜“活动监视器”打开,在活动监视器中搜索docker相关进程强制关闭cd ~/Library/Group\ Containers/group.com.dockerrm -rf settings.json重新打开docker,根据相关提示进行操作即可成功运行参考:Docker - Failed to ping backend...
2021-08-22 13:43:39
1249
1
原创 分布式系统中的一致性模型
下面的图展示了各种一致性之间的关系:分布式数据存储分布式数据存储 Distributed Data-Store [1]数据存储 (data store) 是对可以存储数据的服务的抽象。这里的数据存储可以是:共享内存 (shared-memory)、数据库、文件系统、对象和Web服务器等等。数据存储存储的是一个个的数据项 (data items)。对于不同的数据存储,数据项可以有不同的含义,例如内存的一个页面、数据库的一条记录、文件系统的一个文件、对象的一个变量和一个网页等等。客户端 (cli
2021-07-02 21:32:47
2213
原创 Spring @PropertySource用法和源码分析
用法https://mkyong.com/spring/spring-propertysources-example/[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh5bKk0V-1620551204402)(C:\Users\Lv Hao\AppData\Roaming\Typora\typora-user-images\image-20210509144724369.png)]核心类Properties[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下
2021-05-09 17:06:55
757
原创 Class和ClassLoader的getResource方法详解与源码分析
classpathJava中有两个classpath,一个是bootrap classpath,另一个是classpath。classpath有如下两种形式 [4]:JAR files(JAR文件的全路径),andPaths to the top of package hierarchies.(顶级目录路径)bootrap classpathboot class path对应于启动类加载器,根据类加载的双亲委派模型,Java程序运行时首先会由启动类加载器加载boot class path下的
2021-03-09 23:02:47
3928
原创 InnoDB的行格式
MySQL中,由存储引擎负责数据的存储和读取,数据在不同存储引擎中的存储格式一般是不同的。下面将主要讲述InnoDB中数据的存储结构。InnoDB的页InnoDB按页组织数据,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB。InnoDB的行格式行格式,也叫记录格式。InnoDB中支持4种行格式:CompactRedundantDynamicCompressed可以通过如下命令指定或修改行格式:create table 表名 (列信息) row_format
2020-09-10 22:57:58
600
原创 MySQL explain命令总结
explain有什么用(执行计划)https://dev.mysql.com/doc/refman/8.0/en/explain-output.htmlexplain命令支持SELECT, DELETE, INSERT, REPLACE, UPDATE语句,它可以输出SQL语句的执行计划,通过执行计划我们可以了解MySQL是如何执行给定的SQL语句的。具体来说,explain的输出包含如下信息:对于SELECT语句中使用到的每张表,输出一行对应的信息表信息的顺序就是MySQL处理该语句时读取
2020-09-05 14:15:09
349
原创 ReentrantReadWriteLock源码分析
一、ReentrantReadWriteLock官方文档https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.htmlpublic class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable1. 锁的获取顺序对于获取获取锁的顺序,该类并没有特殊的偏向读者或写者
2020-08-21 13:53:59
276
原创 AQS框架-谈谈对AQS框架的理解
AQS是一个框架,基于它我们可以实现锁和同步器,J.U.C.包中和很多锁和同步器都是基于AQS实现的。使用AQS的方式通常不是让锁或同步器直接继承AQS类,而是将AQS的子类作为锁或同步器类的一个辅助内部类,锁或同步器的方法调用AQS子类对象的方法完成同步操作。(图片来自网络)state字段AQS中最重要的一个字段就是同步状态字段state,锁和同步器的实现都是围绕着这个字段的修改展开的,AQS中也暴露出了一些方法供我们重写以操作这个字段,例如tryAcquire, tryRelease, try
2020-08-19 20:30:11
3153
原创 Thread.sleep, Object.wait 和 LockSupport.park 的区别
Thread.sleep, Object.wait 和 LockSupport.park 的对比
2020-08-15 14:53:36
348
原创 Spring之循环依赖
所谓循环依赖,顾名思义,就是类 A 依赖类 B,类B同时也依赖类A。Spring解决了基于setter注入和基于field注入的单例bean的循环依赖问题,没有解决基于构造器的注入以及原型作用域的bean的循环依赖问题。一、三级缓存三级缓存对循环依赖的解决至关重要,Spring中的三级缓存在DefaultSingletonBeanRegistry中定义:/** Cache of singleton objects: bean name to bean instance. * 一级缓存: 存放完整的b
2020-08-10 19:25:18
340
原创 Java final关键字在JMM中的含义
参考:[1] JSR 133 (Java Memory Model) FAQ[2] The JSR-133 Cookbook for Compiler Writers一、properly constructed / this对象逸出在开始讲之前final之前,先了解一个概念,叫做 “properly constructed”。其含义是:在构造器创建对象的过程中,正在被创建的对象的引用没有发生 “逸出(escape)” 。public Test { private final int
2020-07-29 21:02:23
857
2
原创 内存一致性模型笔记 (Memory Consistency Model)
参考文档:[1] Multiprocessors should support simple memory consistency models[2] Shared MemoryConsistency Models:A Tutorial一、什么是内存模型?内存模型 (memory model),也叫内存一致性模型 (memory consistency model),它可以简单的理解为一系列对内存读写操作的规定,包括针对内存读写操作的重排序规则、可见性规则(一次读操作能否看到最近一次写入的结果?
2020-07-27 21:28:29
4605
2
Spring 5.2.4版本官方文档英文pdf(Spring Core + Spring MVC + ...)
2020-03-09
python机器学习 中文版 Sebastian Raschka
2018-02-04
Dafydd Stuttard
2015-07-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅