SpringBoot MongoDB 全操作指南

SpringBoot 集成 MongoDB:CRUD 到聚合全操作 📖 前置阅读:本文假设读者已了解 MongoDB 的文档模型、BSON 数据类型和 mongosh 基础操作。如果还不熟悉,建议先阅读 MongoDB 核心概念:文档模型、BSON 与查询操作符全解析。 本文按照"先搞懂操作 → 教程版完整实现 → 生产版架构模式 → 验证排错“的顺序组织。如果你只想快速上手 MongoTemplate 的 CRUD,读完 Part 1 后直接看 Part 2 即可;如果你想理解真实项目中 MongoDB 是怎么用的,需要完整读完。 Part 1:先搞懂要做什么 一、目标说明 这篇文章的目标:让读者在一篇文章内学会 SpringBoot 项目中所有常用的 MongoDB 操作,读完就能直接写到项目里。 具体来说,读完这篇文章会掌握: 用 @Document / @Id / @Field 注解定义 MongoDB 文档映射 用 MongoTemplate 执行 CRUD、复杂查询、更新操作 用 MongoRepository 做声明式查询(方法命名 + @Query) 聚合管道的 Java 写法初探 一个完整的"用户自定义表单"功能从零到一的实现 二、前置条件 前置项 具体要求 验证命令 JDK 17+(文中用 17,8+ 均兼容) java -version Maven 3.6+ mvn -v SpringBoot 3.x(文中用 3.2.0) mvn dependency:tree | grep spring-boot MongoDB 7.0(6.x 也兼容文中所有操作) mongosh --eval "db.version()" 前置知识 SpringBoot 基础、MongoDB 核心概念(第一篇) — Part 2:教程版 —— 从零掌握 MongoDB 全部操作 下面每一节都给出了完整的、可运行的代码。整个教程版使用同一个技术栈:Spring Boot 3.x + spring-boot-starter-data-mongodb,所有操作通过 MongoTemplate 和 MongoRepository 完成。 ...

十月 27, 2022 · 11 分钟 · 2206 字 · yaomingye

SpringBoot Elasticsearch 全操作指南

SpringBoot Elasticsearch 📖 前置阅读:本文假设读者已了解 ES 的倒排索引、分词器、Mapping 和 REST API 基础操作。如果还不熟悉,建议先阅读 Elasticsearch 核心概念:倒排索引、分词器与 REST API 全解析。 本文按照"先搞懂操作 → 教程版完整实现 → 生产版四种模式 → 验证排错“的顺序组织。如果你只想快速上手 ElasticsearchRestTemplate 的 CRUD 和搜索,读完 Part 1 后直接看 Part 2 即可;如果你想理解真实项目中 ES 是怎么承载搜索、同步、秒杀、推荐四种场景的,需要完整读完。 关于版本:Part 2 教程版使用 Spring Boot 3.x + 新版 ElasticsearchClient(spring-boot-starter-data-elasticsearch 自动配置);Part 3 生产版使用 Spring Boot 2.7.x + RestHighLevelClient(手动创建 Bean)。两个版本不能混用——读者根据自己的 Spring Boot 版本选择对应的代码。 Part 1:先搞懂要做什么 一、目标说明 这篇文章的目标很明确:让读者在一篇文章内学会 SpringBoot 项目中所有常用的 ES 操作,读完就能直接写到项目里。 具体来说,读完这篇文章会掌握: 用 @Document 和 @Field 注解定义 ES 映射 用 ElasticsearchRestTemplate 执行 CRUD、搜索、聚合、高亮 用 Spring Data ES Repository 做声明式查询 批量写入、条件删除 和 真实场景串联 一个完整的"商品搜索"功能从零到一的完整代码 二、前置条件 前置项 具体要求 验证命令 JDK 17+(文中用 17,8+ 均兼容) java -version Maven 3.6+ mvn -v SpringBoot 3.x(文中用 3.2.0) mvn dependency:tree | grep spring-boot Elasticsearch 8.x(7.x 也兼容文中大部分操作,需调整配置) curl -u elastic http://localhost:9200 前置知识 SpringBoot 基础、ES 核心概念(倒排索引、分词器、Mapping) — Part 2:教程版 —— 从零掌握 ES 全部操作 下面每一节都给出了完整的、可运行的代码。整个教程版使用同一个技术栈:Spring Boot 3.x + spring-boot-starter-data-elasticsearch,通过 ElasticsearchRestTemplate 操作 ES。 ...

十月 23, 2022 · 14 分钟 · 2948 字 · yaomingye

SpringBoot Redis 全操作指南

🚀 SpringBoot Redis 全操作指南 📖 前置阅读:本文假设读者已了解 Redis 的五种核心数据结构(String / Hash / List / Set / ZSet)和基本命令。如果还不熟悉,建议先阅读 Redis 核心架构:五大数据结构与常用命令全解析。 🎯 第一步:目标说明 这篇文章的目标很明确:让读者在一篇文章内学会 SpringBoot 项目中所有常用的 Redis 操作,读完就能直接写到项目里。 具体来说,读完这篇文章会掌握: 用 StringRedisTemplate 和 RedisTemplate 操作 Redis 五种数据结构 用 Spring Cache 注解(@Cacheable、@CachePut、@CacheEvict)无侵入地加缓存 用 Redisson 实现分布式锁 Pipeline 批量操作和发布订阅 排行榜、计数器、消息队列等真实业务场景的完整代码 文中的所有代码都可以直接复制粘贴到项目里,只需要改包名和类名。 📋 第二步:前置条件 开始之前,确认以下知识储备和环境就绪: 前置项 具体要求 验证命令 JDK 17+(文中用 17,8+ 均兼容) java -version Maven 3.6+ mvn -v SpringBoot 3.x(文中用 3.2.0) mvn dependency:tree | grep spring-boot Redis 7.x(6.x 也兼容文中所有操作) redis-cli --version IDE IntelliJ IDEA / VS Code / Eclipse 均可 — 前置知识 SpringBoot 基础(依赖注入、application.yml)、SQL 基础、Linux 命令行基础 — 📌 前置知识:读者需要了解 SpringBoot 的 @Configuration、@Bean、@Autowired 基本用法,以及 application.yml 配置文件的写法。如果不熟悉 Maven 的 pom.xml 依赖管理,建议先补一下 SpringBoot 入门。 ...

十月 20, 2022 · 17 分钟 · 3462 字 · yaomingye

Spring Boot 面试突击

Spring Boot 面试突击:高频考点全面解析 📌 前置知识:阅读本文需要具备 Java 基础、Servlet 基础、Spring 基础(IoC / AOP / Bean 容器概念)。本文定位为面试突击速查手册,每个考点都按"面试怎么答"组织,建议配合实际项目经验一起记忆。 📊 各模块面试频率参考 在开始具体考点之前,先了解各模块的面试出现频率,有助于合理分配背诵时间: 模块 面试频率 重要程度 基础概念 ⭐⭐⭐⭐⭐ 每场必问,开场热身 核心注解 ⭐⭐⭐⭐⭐ @SpringBootApplication 必问 自动配置原理 ⭐⭐⭐⭐⭐ 灵魂考点,区分候选人水平 配置文件 ⭐⭐⭐⭐⭐ 多环境配置高频出现 事务管理 ⭐⭐⭐⭐⭐ 事务失效原因超高频 Bean 生命周期 ⭐⭐⭐⭐⭐ 面试官最爱追问 Web/MVC ⭐⭐⭐⭐ 结合项目经验考察 AOP ⭐⭐⭐⭐ 原理 + 应用场景 Starter ⭐⭐⭐⭐ 自定义 Starter 加分项 高级特性 ⭐⭐⭐⭐ 3.x 变化、热部署 Actuator ⭐⭐⭐ 生产经验加分 重点背诵:自动配置原理、事务失效原因、Bean 生命周期、@SpringBootApplication 组成、配置加载优先级。 📖 一、基础概念题 ❓ 1.1 什么是 Spring Boot?与 Spring、Spring MVC 的关系? 这是最基础的面试开场题,回答需要简洁清晰、一句话点明三者关系。 ...

十月 17, 2022 · 11 分钟 · 2166 字 · yaomingye

Spring Boot Starter 封装实践报告

Spring Boot Starter 封装实践报告:从自动装配原理到手写 Starter 🎯 第 1 步:目标说明 某开发者在日常工作中频繁需要为项目集成日志记录、性能监控、消息通知等功能。每次引入新功能时,都要重复编写相似的配置类、注册 Bean、管理依赖——这些步骤机械而繁琐。Spring Boot Starter 正是为解决这一问题而设计的机制:它把自动配置类与依赖管理打包成一个独立的 Jar 包,引用一个 Starter 依赖就能让某个功能"开箱即用"。 本实践报告的目标如下: 理解 Spring Boot 自动装配(Auto Configuration)的核心原理与执行流程 动手封装一个名为 my-logging-spring-boot-starter 的自定义 Starter,功能是自动记录标注了特定注解的方法的执行耗时 在测试项目中引用自定义 Starter,验证功能正常工作 📌 前置知识:本报告假设读者已经掌握 Java 基础语法、Maven 依赖管理与模块化工程、Spring 的 @Bean 与 @Configuration 注解、Spring Boot 基本使用方式。 📋 第 2 步:前置条件 开始实践前,确保以下软件已正确安装。 软件/依赖 最低版本 说明 JDK 17 Spring Boot 3.2.0 要求 Java 17 及以上 Maven 3.6.3 项目构建、依赖管理与打包 IDE 任意 IntelliJ IDEA(社区版即可)或 VS Code 验证安装: java --version # 期望输出示例:openjdk 17.0.9 2023-10-17 LTS mvn --version # 期望输出示例:Apache Maven 3.9.5 ⚠️ 新手提示:如果 java --version 或 mvn --version 提示"命令未找到",说明对应软件没有安装或没有配置环境变量。JDK 需要设置 JAVA_HOME 并将 %JAVA_HOME%\bin 加入 PATH。Maven 需要将 MAVEN_HOME/bin 加入 PATH。完成配置后重新打开终端再执行验证命令。 ...

十月 14, 2022 · 14 分钟 · 2963 字 · yaomingye

一次性讲明白 Filter、Interceptor、RequestAdvice、ResponseAdvice

一次性讲明白 Filter、Interceptor、RequestAdvice、ResponseAdvice:执行顺序与实际应用 一、从一个常见需求说起 开发一个 Web 接口,通常需要处理以下事情: 记录每个请求的耗时日志 校验登录态,未登录拒绝访问 对请求参数做预处理(比如解密、格式转换) 对响应结果做统一封装(比如统一返回 {code, msg, data} 格式) 这四个需求对应的正是四个组件: 需求 对应组件 执行位置 记录请求日志 Filter Servlet 容器层(最外层) 登录校验 Interceptor Spring MVC 层(Controller 前后) 请求参数预处理 RequestAdvice Controller 方法执行前 响应统一封装 ResponseAdvice Controller 方法执行后 这四个组件在一条请求链路中各自负责不同的阶段。先看一张总览图,建立位置感: flowchart TD %% 半暗底色 + 高亮描边:完美适配博客深色/浅色双主题 %% classDef process fill:#1e1e24,stroke:#6b7280,stroke-width:2px,color:#e5e7eb; classDef data fill:#052e16,stroke:#16a34a,stroke-width:2px,color:#bbf7d0,font-weight:bold; classDef startEnd fill:#701a4c,stroke:#e11d48,stroke-width:2.5px,color:#fce7f3,font-weight:bold; A[客户端请求] --> B[Filter] B --> C[DispatcherServlet] C --> D[Interceptor.preHandle] D --> E[RequestAdvice] E --> F[Controller] F --> G[ResponseAdvice] G --> H[Interceptor.postHandle] H --> I[Interceptor.afterCompletion] I --> J[Filter 返回] J --> K[客户端响应] class E,G data; class A,B,C,D,F,H,I,K process; class J startEnd; 这张图只需要记住一个核心原则: Filter 在最外层,Interceptor 在中间层,Advice 在最内层(紧贴 Controller)。 请求进来从外到内,响应出去从内到外。 ...

十月 9, 2022 · 7 分钟 · 1426 字 · yaomingye

Spring Boot 开发中的上下文

Spring Boot 开发必知:那些高频使用的核心上下文类 🐛 从一个 NPE 说起 同事在 IdUtils 工具类里写了一个生成订单号的方法,需要调用数据库序列服务。代码部署到生产环境后,每隔几天就会抛出一个 NullPointerException,而且总是在凌晨 2 点左右。 排查后发现问题:生成订单号的逻辑需要从 Spring 容器中获取 SequenceService,但 IdUtils 是一个纯静态工具类,不归 Spring 管理。同事的写法是: public class IdUtils { // 这样永远拿不到 Bean——IdUtils 自己都没被 Spring 管理,谁来注入? @Autowired private static SequenceService sequenceService; public static String genOrderId() { return sequenceService.nextVal("order"); // NPE! sequenceService == null } } 这是一个典型场景: 需要在不受 Spring 管理的类中获取 Spring Bean 。解决它的钥匙就是本篇要讲的"上下文类"(Context Classes)——Spring 框架提供的一系列能让你在任何位置获取框架运行时状态的工具。 flowchart LR classDef root fill:#0f172a,stroke:#3b82f6,stroke-width:2px,color:#bfdbfe,font-weight:bold; classDef branch fill:#2d1a05,stroke:#f59e0b,stroke-width:2px,color:#fde68a,font-weight:bold; classDef leaf fill:#1e1e24,stroke:#6b7280,stroke-width:1.5px,color:#e5e7eb; classDef highlight fill:#450a0a,stroke:#dc2626,stroke-width:1.5px,color:#fecaca,font-weight:bold; ROOT[Spring Boot 核心上下文类] ROOT --> B1(1. Web 请求上下文) B1 --> L1["RequestContextHolder\n持有当前请求的 ThreadLocal"] B1 --> L2["ServletRequestAttributes\n封装 HttpServletRequest/Response"] B1 --> L3["RequestContextUtils\nLocale / FlashMap / 输入输出流"] ROOT --> B2(2. Security 安全上下文) B2 --> L4["SecurityContextHolder\n持有当前认证信息的 ThreadLocal"] B2 --> L5["Authentication\nPrincipal / Credentials / Authorities"] ROOT --> B3(3. 事务上下文) B3 --> L6["TransactionSynchronizationManager\n事务状态判断 / 回调注册\n事务资源绑定"] ROOT --> B4(4. 容器上下文) B4 --> L7["ApplicationContext\nSpring 容器本身"] B4 --> L8["ApplicationContextAware\n回调注入容器引用"] B4 --> L9["Environment\n配置属性 / Profile"] ROOT --> B5(5. 其他) B5 --> L10["LocaleContextHolder\n国际化语言上下文"] B5 --> L11["BeanFactory\n底层 IoC 容器"] class ROOT root; class B1,B2,B3,B4,B5 branch; class L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11 leaf; class L1,L4,L7 highlight; 🌐 一、Web 请求上下文 ⚙️ 1.1 核心类与底层原理 RequestContextHolder(请求上下文持有者)通过 ThreadLocal(线程局部变量)将当前请求的 ServletRequestAttributes 绑定到当前线程。DispatcherServlet(Spring MVC 的前端控制器)在处理每个请求时,会自动调用 RequestContextHolder.setRequestAttributes() 将请求对象"挂"到当前线程上。 ...

十月 7, 2022 · 12 分钟 · 2418 字 · yaomingye

Spring Boot 日志

Spring Boot 日志:打点位置、框架选型与线上排查全解析 🐛 问题切入:一段没有日志的代码 下面是一个新手开发者写的 Spring Boot 订单服务: @RestController @RequestMapping("/order") public class OrderController { @Autowired private OrderService orderService; @PostMapping("/create") public Result<Order> createOrder(@RequestBody CreateOrderRequest req) { Order order = orderService.createOrder(req); return Result.success(order); } } @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private InventoryService inventoryService; @Transactional public Order createOrder(CreateOrderRequest req) { // 扣减库存 boolean deducted = inventoryService.deduct(req.getProductId(), req.getQuantity()); if (!deducted) { throw new BusinessException("库存不足"); } // 创建订单 Order order = new Order(); order.setUserId(req.getUserId()); order.setAmount(req.getAmount()); orderMapper.insert(order); return order; } } 某天线上出现了一个问题:用户投诉"我付了钱但订单没创建成功"。后端同学打开服务器,面对空荡荡的日志文件(只有 Spring Boot 默认的启动 banner),完全不知道从哪里下手。 ...

九月 30, 2022 · 13 分钟 · 2638 字 · yaomingye

API 响应封装

API 响应封装:统一返回格式、全局自动包装与异常处理全解析 🤔 1. 问题切入:一个没有封装的 Controller 是怎样的? 在开始讲解之前,先看一段没有做任何统一封装的 Controller 代码: @RestController @RequestMapping("/api/product") public class ProductController { @Autowired private ProductService productService; @GetMapping("/findById") public ProductEntity findById(Long id) { ProductEntity product = productService.findById(id); if (product == null) { // 直接返回 null,前端收到空响应体,不知道发生了什么 return null; } return product; } @PostMapping("/insert") public String insert(@RequestBody ProductEntity product) { try { productService.insert(product); return "success"; // 字符串硬编码,前后端契约不统一 } catch (Exception e) { return e.getMessage(); // 把异常栈暴露给前端,安全风险 } } } 这段代码暴露了三个问题: ...

九月 26, 2022 · 10 分钟 · 2010 字 · yaomingye

Servlet 网络编程

🌐 Servlet 网络编程:从 HTTP 协议到 RESTful API、过滤器链、监听器与 Tomcat 部署全解析 1. 问题切入:不用 Spring,如何写一个 HTTP API? 假设你要开发一个用户管理的 RESTful API,要求: 支持 JSON 格式的增删改查 对每个请求打印访问日志 校验请求头中的认证 Token 处理跨域请求 如果使用 Spring Boot,一个 @RestController 就解决了。但 Spring MVC 的底层是什么?DispatcherServlet、FilterChain、HandlerInterceptor 这些概念是怎么来的? 这篇博客将用纯 Servlet 实现上述所有需求,让你理解 Spring MVC 底层的每一块砖。 在开始之前,先看最终效果 —— 一个纯 Servlet 实现的用户 API: // GET /api/users → 查询所有用户(JSON) // GET /api/users/1 → 查询单个用户(JSON) // POST /api/users → 创建用户(JSON请求体) // PUT /api/users/1 → 更新用户(JSON请求体) // DELETE /api/users/1 → 删除用户 2. Servlet 是什么 Servlet(Server Applet,服务端小程序)是 Java EE 规范中定义的一套 服务器端 HTTP 处理接口。它不是独立运行的程序,而是运行在 Servlet 容器(如 Tomcat)中,由容器管理其生命周期,并调用其方法来处理 HTTP 请求。 ...

九月 25, 2022 · 12 分钟 · 2428 字 · yaomingye
Cat Radio