<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ityqing的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ityqing</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ityqing]]></copyright><item><title><![CDATA[09 — 仓储与基础设施层]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/162876721</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/162876721</guid><author>ityqing</author><pubDate>Tue, 14 Jul 2026 15:57:17 +0800</pubDate><description><![CDATA[本文阐述了基础设施层在DDD架构中的核心职责，重点分析了仓储模式的实现方式及其与DAO的区别。文章指出基础设施层负责所有技术细节的实现，包括对外部资源的适配（如数据库、消息队列等），而领域层和应用层仅依赖抽象接口。仓储作为聚合根的持久化抽象，提供集合语义的操作接口，与DAO在关注点、操作方式等方面存在显著差异。文中还提供了Spring Boot下仓储+MyBatis的完整实现示例，展示了PO与领域对象的转换过程，并强调了DDD中对象分层的重要性（PO/DO/DTO）。通过依赖倒置原则，实现了技术细节与业务逻]]></description><category></category></item><item><title><![CDATA[08 — 领域事件与 CQRS]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/162518543</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/162518543</guid><author>ityqing</author><pubDate>Thu, 02 Jul 2026 13:57:31 +0800</pubDate><description><![CDATA[领域事件实现模式解析 本文系统介绍了领域事件（Domain Event）的概念与分层实现方案，通过代码示例展示了从领域层到基础设施层的完整事件处理流程： 领域事件定义 - 在领域层创建不可变的事件类（如OrderPlacedEvent），继承自基类DomainEvent，包含业务事实的核心数据。 事件收集机制 - 聚合根在执行业务逻辑时生成事件并暂存于内存列表（如Order聚合的place()方法），通过getDomainEvents()对外提供访问。 分层处理架构： 应用层：负责事务提交后的事件发布，使用]]></description><category></category></item><item><title><![CDATA[07 — 仓储、基础设施层与 DDD 分层架构]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/162491379</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/162491379</guid><author>ityqing</author><pubDate>Wed, 01 Jul 2026 16:13:08 +0800</pubDate><description><![CDATA[应用服务只负责"将订单和优惠券传给领域服务，拿到最终价格"。判断依据：把"规则"和"步骤"剥离——领域服务拿到已加载的聚合对象，只负责业务判断；这是 DDD 落地中最高频的困惑：同样是一段业务代码，到底该写在应用服务里，还是放进领域对象/领域服务中？：在应用服务中既写"加载 A 和 B"，又写"A 扣减、B 增加"的业务逻辑，把流程和规则混在一起。判断依据：条件的含义是"业务约束"，不是"流程控制"。判断依据：计算逻辑涉及多个领域对象，且规则本身具有业务含义（换了什么框架都不变），放领域服务。]]></description><category></category></item><item><title><![CDATA[06 — 接口层架构与实现]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/162491245</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/162491245</guid><author>ityqing</author><pubDate>Wed, 01 Jul 2026 16:09:44 +0800</pubDate><description><![CDATA[横切关注点（Cross-cutting Concerns）是那些不属于单个业务用例、但需要在多处统一处理的逻辑，通常通过拦截器、过滤器或 AOP 实现，统一放在接口层。判断核心：接口层配置管的是"API 对外暴露的行为"（CORS、异常格式、文档）；基础设施层配置管的是"技术框架怎么运作"（连接池、序列化、调度器）。它本身不包含任何业务逻辑。）按照**“它在配置哪一层的技术基础设施”**来决定归属，而不是按照它使用了哪种注解。规则）、直接调用仓储、直接操作领域对象。]]></description><category></category></item><item><title><![CDATA[05 — 分层架构与依赖倒置]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/161518583</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/161518583</guid><author>ityqing</author><pubDate>Fri, 29 May 2026 15:32:51 +0800</pubDate><description><![CDATA[DDD四层架构解析：领域驱动设计的核心分层与职责 摘要： 本文系统介绍了DDD（领域驱动设计）的四层架构体系，包括接口层、应用层、领域层和基础设施层。架构核心原则是依赖方向始终指向领域层，保持领域层作为系统最稳定核心。接口层负责协议适配，应用层专注用例编排，领域层封装所有业务规则，基础设施层处理技术实现。文章详细说明了各层职责边界、典型实现方式以及与MVC模式的对比，特别强调了领域层"不依赖框架"的设计原则，给出了依赖许可边界的明确标准。通过这种分层架构，DDD实现了业务逻辑与技术实现的解耦，使系统具备更好]]></description><category></category></item><item><title><![CDATA[04 — 战术设计：实体、值对象与聚合]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/161477119</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/161477119</guid><author>ityqing</author><pubDate>Thu, 28 May 2026 10:17:58 +0800</pubDate><description><![CDATA[领域驱动设计中的实体与值对象 本文对比了MVC与DDD中实体和值对象的核心区别： 实体是具有唯一标识的领域对象，其身份(ID)在整个生命周期中保持不变，而状态可以变化。实体通过ID判断相等性，包含业务行为而非简单的数据容器。 值对象则通过属性值判断相等，是不可变对象。值对象描述"是什么"而非"是哪个"，任何修改都需要创建新实例而非改变现有对象。 关键差异： 实体关注身份标识(ID)，值对象关注属性值 实体可变，值对象不可变 实体包含业务行为，值对象主要承载数据 实体相等性基于ID，值对象相等性基于所有属性 ]]></description><category></category></item><item><title><![CDATA[03 — 战略设计：限界上下文]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/161476758</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/161476758</guid><author>ityqing</author><pubDate>Thu, 28 May 2026 10:12:47 +0800</pubDate><description><![CDATA[本文介绍了限界上下文的概念及其识别方法，重点阐述了上下文映射模式及其实现。主要内容包括： 识别限界上下文的三种方法：事件风暴、术语冲突分析、组织结构分析（康威定律） 上下文内部的模型设计原则：保持概念精确独立，避免直接关联外部对象 六种上下文映射模式： 合作关系/共享内核（平等协作） 客户方-供应方/遵从者（上下游关系） 防腐层/开放主机服务（集成模式） 重点模式实现： 防腐层(ACL)通过适配器隔离外部模型 开放主机服务(OHS)提供标准化接口 发布-订阅模式通过领域事件解耦 代码示例展示了防腐层的典型实]]></description><category></category></item><item><title><![CDATA[02 — DDD 核心概念全景]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/160863468</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/160863468</guid><author>ityqing</author><pubDate>Thu, 07 May 2026 17:16:04 +0800</pubDate><description><![CDATA[本文介绍了领域驱动设计（DDD）中的核心概念与实践方法。主要内容包括：1）领域与子域划分，强调将业务划分为核心域、支撑域和通用域，重点投入核心域；2）通用语言的建立与应用，确保业务与开发使用统一术语；3）限界上下文的概念与实现，通过物理边界隔离不同业务模块；4）上下文映射模式，包括顺从者、防腐层和发布-订阅三种协作方式，推荐使用防腐层和发布-订阅实现低耦合。这些方法有助于构建清晰、可维护的复杂业务系统。]]></description><category></category></item><item><title><![CDATA[01 — MVC 与 DDD 的思维差异]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/160597399</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/160597399</guid><author>ityqing</author><pubDate>Tue, 28 Apr 2026 17:08:06 +0800</pubDate><description><![CDATA[MVC 与 DDD 的核心思维差异 MVC 和 DDD 代表了两种截然不同的设计思维：MVC 关注技术分层，DDD 聚焦业务建模。 MVC 架构存在四大痛点：贫血模型导致业务逻辑分散、Service 层无限膨胀、技术与业务语言脱节、跨层依赖难以测试。其核心问题是业务逻辑被分散在各层，缺乏统一的领域模型。 DDD 通过战略设计（限界上下文、通用语言）和战术设计（实体、值对象、聚合）重构系统架构。与 MVC 按技术职责分层不同，DDD 采用四层架构（接口层、应用层、领域层、基础设施层），以领域层为核心，每个业务]]></description><category></category></item><item><title><![CDATA[Spring Validation Service层验证]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/155785747</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/155785747</guid><author>ityqing</author><pubDate>Wed, 10 Dec 2025 17:04:18 +0800</pubDate><description><![CDATA[本文介绍了在Service层实现参数验证的两种主要方式：注解验证和编程式验证。通过@Validated注解可开启方法级验证，支持分组验证（如创建/更新操作使用不同规则）。编程式验证则通过手动调用Validator实现更灵活的控制，适合批量处理场景。文中展示了订单服务和商品服务的具体实现，包括DTO验证规则定义、分组验证应用以及批量导入时的错误收集处理。两种方式结合使用可构建健壮的参数验证体系，确保业务逻辑执行前数据的合法性。]]></description><category></category></item><item><title><![CDATA[Optional 使用指南]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/155535744</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/155535744</guid><author>ityqing</author><pubDate>Wed, 03 Dec 2025 16:53:26 +0800</pubDate><description><![CDATA[Java 8 引入的 Optional 是一个容器类，用于优雅处理可能为 null 的值。它通过包装可能为空的值，避免了传统方式中繁琐的 null 检查和嵌套判断。Optional 提供链式方法如 map()、flatMap()、filter()，以及安全的取值方式 orElse()/orElseGet()。创建 Optional 推荐使用 ofNullable()，业务方法应返回 Optional.empty() 而非 null。相比直接使用 null，Optional 使代码更清晰安全，是处理空值的现代]]></description><category></category></item><item><title><![CDATA[Spring Boot初始化钩子全解析]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/153470461</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/153470461</guid><author>ityqing</author><pubDate>Fri, 17 Oct 2025 15:08:28 +0800</pubDate><description><![CDATA[Spring Boot初始化钩子机制提供了多样化的应用启动阶段拦截点，涵盖从容器创建到应用就绪的全过程。核心钩子包括：SpringApplicationRunListener（启动阶段拦截）、BeanPostProcessor（Bean初始化拦截）、CommandLineRunner/ApplicationRunner（启动后执行）、@PostConstruct/InitializingBean（Bean生命周期）、ApplicationListener（事件监听）以及JVM关闭钩子。这些钩子按精确时序执行]]></description><category></category></item><item><title><![CDATA[Spring Data Jpa 使用EntityManager执行SQL操作数据]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/135408871</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/135408871</guid><author>ityqing</author><pubDate>Fri, 05 Jan 2024 14:28:28 +0800</pubDate><description><![CDATA[此外，建议在Spring Boot应用程序中使用Spring Data JPA，因为它提供了更高级、更安全的查询方式，并且更符合Spring的习惯。在这个例子中，我们使用了createNativeQuery方法来创建原生SQL查询，并通过setParameter方法设置参数。请注意，这里使用的是原生SQL，因此表名和字段名需要与数据库中的实际情况一致。在实际开发中，为了防止SQL注入等安全问题，最好使用参数化查询，就像上面的例子一样使用setParameter方法。]]></description><category></category></item><item><title><![CDATA[Spring Data Jpa中的@PersistenceContext是什么？]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/135408540</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/135408540</guid><author>ityqing</author><pubDate>Fri, 05 Jan 2024 14:17:34 +0800</pubDate><description><![CDATA[选择使用哪个取决于项目的具体需求。如果你主要使用JPA进行数据库访问，而且愿意保持对JPA的强依赖，那么使用。如果你更倾向于使用Spring的依赖注入机制，并且希望注入其他Spring托管的组件，那么使用。都是用于依赖注入的注解，但它们的使用场景和依赖关系略有不同。在实际项目中，两者都有广泛的应用。]]></description><category></category></item><item><title><![CDATA[发送xml格式的http请求工具类]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/134779120</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/134779120</guid><author>ityqing</author><pubDate>Mon, 04 Dec 2023 11:10:07 +0800</pubDate><description><![CDATA[请求与响应对象要符合JAXB规范。发送xml格式的http请求。]]></description><category></category></item><item><title><![CDATA[一篇文章搞定Spring Cache]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/134690178</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/134690178</guid><author>ityqing</author><pubDate>Wed, 29 Nov 2023 14:55:12 +0800</pubDate><description><![CDATA[使用@Cacheable@CachePut注解时，可以通过condition属性设置缓存失效的条件。例如，只有满足某个条件时才进行缓存：// 方法体逻辑使用unless属性设置条件，如果满足条件，则不会缓存结果。与condition相反，unless表达式的值为true时，不缓存：// 方法体逻辑如果你想使用除默认的之外的缓存管理器，可以自定义@Bean// 自定义的缓存管理器通过自定义缓存注解，你可以在方法上使用自定义的缓存注解，提供更复杂的缓存逻辑。例如：// 方法体逻辑其中。]]></description><category></category></item><item><title><![CDATA[Git常用规范]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/134413254</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/134413254</guid><author>ityqing</author><pubDate>Wed, 15 Nov 2023 09:53:21 +0800</pubDate><description><![CDATA[需要注意的是，使用message模板可以帮助我们规范化提交信息的格式和内容，但并不是所有的提交都需要按照模板来写。在实际开发中，我们应该根据实际情况灵活选择合适的提交信息，并确保提交信息的内容准确、清晰、简洁。总之，代码提交message规范的目的是为了让代码提交记录更加清晰明了，方便团队成员查看和理解提交的内容和目的，从而提高团队协作的效率和质量。其中，、、 和 # 是必填项， 可以省略， 不宜过长，最好不超过50个字符， 和 # 建议使用关键字和Issue编号的形式进行填写。]]></description><category></category></item><item><title><![CDATA[Spring Boot 拦截器 HandlerInterceptor的使用以及WebMvcConfigurer简单介绍]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/134403067</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/134403067</guid><author>ityqing</author><pubDate>Tue, 14 Nov 2023 16:58:52 +0800</pubDate><description><![CDATA[当我们使用Spring Boot构建Web应用程序时，是一个重要的组件，用于拦截请求的处理过程。接口定义了在请求处理的不同阶段执行的方法，允许我们在请求到达处理程序之前和之后执行自定义逻辑。]]></description><category></category></item><item><title><![CDATA[spring boot validation使用]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/134381520</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/134381520</guid><author>ityqing</author><pubDate>Mon, 13 Nov 2023 17:01:08 +0800</pubDate><description><![CDATA[是 Spring Boot 中用于支持数据验证的模块。它建立在 Java Validation API（JSR-380）之上，提供了一种方便的方式来验证应用程序中的数据。以下是使用。]]></description><category></category></item><item><title><![CDATA[使用 ThreadPoolExecutor 管理线程池]]></title><link>https://blog.youkuaiyun.com/ityqing/article/details/133748679</link><guid>https://blog.youkuaiyun.com/ityqing/article/details/133748679</guid><author>ityqing</author><pubDate>Tue, 10 Oct 2023 15:46:16 +0800</pubDate><description><![CDATA[ThreadPoolExecutor 是 Java 多线程编程中非常重要的工具，能够高效地管理线程的生命周期，提高程序性能和资源利用率。合理配置线程池参数，选择适当的拒绝策略，是保证系统稳定性和性能的关键。]]></description><category></category></item></channel></rss>