<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Spring on Ralph's Blog</title><link>https://pothos.dpdns.org/tags/spring/</link><description>Recent content in Spring on Ralph's Blog</description><generator>Hugo -- 0.147.7</generator><language>zh-cn</language><lastBuildDate>Thu, 25 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://pothos.dpdns.org/tags/spring/index.xml" rel="self" type="application/rss+xml"/><item><title>15.SpringBoot注解指南</title><link>https://pothos.dpdns.org/posts/15.springboot%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%8D%97/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://pothos.dpdns.org/posts/15.springboot%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%8D%97/</guid><description>&lt;h1 id="spring-boot-注解指南">Spring Boot 注解指南&lt;/h1>
&lt;h2 id="目录">目录&lt;/h2>
&lt;details>
&lt;summary>点击展开目录&lt;/summary>
&lt;ul>
&lt;li>&lt;a href="#spring-boot-%E6%B3%A8%E8%A7%A3%E6%8C%87%E5%8D%97">Spring Boot 注解指南&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3">核心注解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9B%B8%E5%85%B3">应用程序相关&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%BB%84%E4%BB%B6%E6%B3%A8%E8%A7%A3">组件注解&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E7%9B%B8%E5%85%B3%E6%B3%A8%E8%A7%A3">配置相关注解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7">配置属性&lt;/a>&lt;/li>
&lt;li>&lt;a href="#bean%E9%85%8D%E7%BD%AE">Bean配置&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#web%E7%9B%B8%E5%85%B3%E6%B3%A8%E8%A7%A3">Web相关注解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E8%AF%B7%E6%B1%82%E6%98%A0%E5%B0%84">请求映射&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0">请求参数&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%93%8D%E5%BA%94%E5%A4%84%E7%90%86">响应处理&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9B%B8%E5%85%B3%E6%B3%A8%E8%A7%A3">数据库相关注解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#jpa%E6%B3%A8%E8%A7%A3">JPA注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#mybatis%E6%B3%A8%E8%A7%A3">MyBatis注解&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E7%BC%93%E5%AD%98%E7%9B%B8%E5%85%B3%E6%B3%A8%E8%A7%A3">缓存相关注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AE%89%E5%85%A8%E7%9B%B8%E5%85%B3%E6%B3%A8%E8%A7%A3">安全相关注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%B5%8B%E8%AF%95%E7%9B%B8%E5%85%B3%E6%B3%A8%E8%A7%A3">测试相关注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%85%B6%E4%BB%96%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3">其他常用注解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5">依赖注入&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%88%87%E9%9D%A2%E7%BC%96%E7%A8%8B">切面编程&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E5%A4%84%E7%90%86">异步处理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1">定时任务&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AA%8C%E8%AF%81%E6%B3%A8%E8%A7%A3">验证注解&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%BC%82%E6%AD%A5%E5%A4%84%E7%90%86%E6%B3%A8%E8%A7%A3">并发与异步处理注解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E6%89%A7%E8%A1%8C">异步执行&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%BA%BF%E7%A8%8B%E6%B1%A0%E9%85%8D%E7%BD%AE">线程池配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86">异步事件处理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%87%8D%E8%AF%95%E6%9C%BA%E5%88%B6">重试机制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6">并发控制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B">异步任务配置示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B">异步任务使用示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE">最佳实践建议&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">注意事项&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E9%AB%98%E7%BA%A7%E6%B3%A8%E8%A7%A3%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97">高级注解使用指南&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%9D%A1%E4%BB%B6%E6%B3%A8%E8%A7%A3">条件注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E7%BB%91%E5%AE%9A">配置属性绑定&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE">日志配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E6%95%B0%E9%AA%8C%E8%AF%81">参数验证&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%BC%93%E5%AD%98%E6%B3%A8%E8%A7%A3">缓存注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86">事务管理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AE%89%E5%85%A8%E6%B3%A8%E8%A7%A3">安全注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%9B%91%E6%8E%A7%E5%92%8C%E5%BA%A6%E9%87%8F">监控和度量&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE-1">最佳实践建议&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#jpa%E6%B3%A8%E8%A7%A3%E8%AF%A6%E8%A7%A3">JPA注解详解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%AE%9E%E4%BD%93%E6%98%A0%E5%B0%84%E6%B3%A8%E8%A7%A3">实体映射注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%85%B3%E8%81%94%E5%85%B3%E7%B3%BB%E6%B3%A8%E8%A7%A3">关联关系注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%BB%A7%E6%89%BF%E7%AD%96%E7%95%A5%E6%B3%A8%E8%A7%A3">继承策略注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%9F%A5%E8%AF%A2%E6%B3%A8%E8%A7%A3">查询注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AE%A1%E8%AE%A1%E6%B3%A8%E8%A7%A3">审计注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AA%8C%E8%AF%81%E6%B3%A8%E8%A7%A3-1">验证注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%A4%8D%E5%90%88%E4%B8%BB%E9%94%AE%E6%B3%A8%E8%A7%A3">复合主键注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98%E6%B3%A8%E8%A7%A3">二级缓存注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E5%BB%BA%E8%AE%AE-2">最佳实践建议&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/details>
&lt;h2 id="核心注解">核心注解&lt;/h2>
&lt;h3 id="应用程序相关">应用程序相关&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@SpringBootApplication&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 包含@Configuration、@EnableAutoConfiguration和@ComponentScan&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记主类，Spring Boot应用程序的入口&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableAutoConfiguration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 启用Spring Boot的自动配置机制&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@ComponentScan&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 自动扫描并注册符合条件的组件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记配置类，通常与@Bean结合使用&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="组件注解">组件注解&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Component&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 通用组件注解，标记类为Spring组件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记服务层组件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Repository&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记数据访问层组件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Controller&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记控制器组件（Spring MVC）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RestController&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// @Controller和@ResponseBody的组合，用于RESTful Web服务&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="配置相关注解">配置相关注解&lt;/h2>
&lt;h3 id="配置属性">配置属性&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@ConfigurationProperties&lt;/span>(prefix &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;app&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 绑定外部配置到类属性&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Value&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;${property.name}&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 注入配置属性值&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PropertySource&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;classpath:custom.properties&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定配置文件位置&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="bean配置">Bean配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Bean&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 声明一个Bean，通常在@Configuration类中使用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scope&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;singleton&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定Bean的作用域（singleton/prototype/request/session）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Conditional&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 条件化地创建Bean&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Profile&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;dev&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定Bean在特定Profile下创建&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="web相关注解">Web相关注解&lt;/h2>
&lt;h3 id="请求映射">请求映射&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RequestMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/path&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 通用请求映射&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@GetMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/path&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// GET请求映射&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PostMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/path&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// POST请求映射&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PutMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/path&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// PUT请求映射&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@DeleteMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/path&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// DELETE请求映射&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PatchMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/path&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// PATCH请求映射&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="请求参数">请求参数&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RequestParam&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 绑定请求参数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RequestParam&lt;/span>(value &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;id&amp;#34;&lt;/span>, required &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>, defaultValue &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;0&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">private&lt;/span> String id;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PathVariable&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 绑定URL路径变量&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@GetMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/users/{id}&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> User &lt;span style="color:#a6e22e">getUser&lt;/span>(&lt;span style="color:#a6e22e">@PathVariable&lt;/span> Long id)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RequestBody&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 绑定请求体&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PostMapping&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;/users&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> User &lt;span style="color:#a6e22e">createUser&lt;/span>(&lt;span style="color:#a6e22e">@RequestBody&lt;/span> User user)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RequestHeader&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 绑定请求头&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@CookieValue&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 绑定Cookie值&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="响应处理">响应处理&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@ResponseBody&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 将返回值序列化为响应体&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@ResponseStatus&lt;/span>(HttpStatus.&lt;span style="color:#a6e22e">OK&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定响应状态码&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@ExceptionHandler&lt;/span>(Exception.&lt;span style="color:#a6e22e">class&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 处理特定异常&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@ControllerAdvice&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 全局控制器增强，通常用于全局异常处理&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="数据库相关注解">数据库相关注解&lt;/h2>
&lt;h3 id="jpa注解">JPA注解&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Entity&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记JPA实体类&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Table&lt;/span>(name &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;users&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定数据库表名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Id&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记主键字段&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@GeneratedValue&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 主键生成策略&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Column&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定列属性&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Transactional&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 声明事务&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mybatis注解">MyBatis注解&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Mapper&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记MyBatis映射器接口&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Select&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;SELECT * FROM users&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// SQL查询语句&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Insert&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;INSERT INTO users(name) VALUES(#{name})&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// SQL插入语句&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Update&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;UPDATE users SET name = #{name}&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// SQL更新语句&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Delete&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;DELETE FROM users WHERE id = #{id}&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// SQL删除语句&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="缓存相关注解">缓存相关注解&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Cacheable&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 缓存方法返回值&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Cacheable&lt;/span>(value &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;users&amp;#34;&lt;/span>, key &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;#id&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> User &lt;span style="color:#a6e22e">getUser&lt;/span>(Long id)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@CacheEvict&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 清除缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@CacheEvict&lt;/span>(value &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;users&amp;#34;&lt;/span>, allEntries &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">clearCache&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@CachePut&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 更新缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@CachePut&lt;/span>(value &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;users&amp;#34;&lt;/span>, key &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;#user.id&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> User &lt;span style="color:#a6e22e">updateUser&lt;/span>(User user)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableCaching&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 启用缓存支持&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="安全相关注解">安全相关注解&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Secured&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ROLE_ADMIN&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 基于角色的安全控制&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PreAuthorize&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;hasRole(&amp;#39;ADMIN&amp;#39;)&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 方法执行前的权限检查&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@PostAuthorize&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;returnObject.username == authentication.name&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 方法执行后的权限检查&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@RolesAllowed&lt;/span>({&lt;span style="color:#e6db74">&amp;#34;USER&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;ADMIN&amp;#34;&lt;/span>})
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定允许访问的角色&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="测试相关注解">测试相关注解&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@SpringBootTest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Spring Boot测试类&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Test&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 测试方法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@MockBean&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 模拟Bean&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@AutoConfigureMockMvc&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 配置MockMvc&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@WebMvcTest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// MVC测试&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@DataJpaTest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// JPA测试&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="其他常用注解">其他常用注解&lt;/h2>
&lt;h3 id="依赖注入">依赖注入&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Autowired&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 自动注入依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Qualifier&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;beanName&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定注入的Bean名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Resource&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 按名称注入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Inject&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// JSR-330依赖注入&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="切面编程">切面编程&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Aspect&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 声明切面&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Before&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;execution(* com.example.service.*.*(..))&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 前置通知&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@After&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 后置通知&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Around&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 环绕通知&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@AfterReturning&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 返回通知&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@AfterThrowing&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 异常通知&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="异步处理">异步处理&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableAsync&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 启用异步处理&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记异步方法&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="定时任务">定时任务&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableScheduling&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 启用定时任务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>(fixedRate &lt;span style="color:#f92672">=&lt;/span> 5000)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 定时执行，固定速率&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>(cron &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;0 0 12 * * ?&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 使用cron表达式定时执行&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="验证注解">验证注解&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Valid&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 触发验证&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@NotNull&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 非空验证&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Size&lt;/span>(min &lt;span style="color:#f92672">=&lt;/span> 2, max &lt;span style="color:#f92672">=&lt;/span> 30)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 字符串长度验证&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Email&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 邮箱格式验证&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Pattern&lt;/span>(regexp &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;^[0-9]{10}$&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 正则表达式验证&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="并发与异步处理注解">并发与异步处理注解&lt;/h2>
&lt;h3 id="异步执行">异步执行&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableAsync&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 在配置类上使用，启用异步功能&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableAsync&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">AsyncConfig&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> AsyncConfigurer {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> Executor &lt;span style="color:#a6e22e">getAsyncExecutor&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ThreadPoolTaskExecutor executor &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> ThreadPoolTaskExecutor();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setCorePoolSize&lt;/span>(5);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setMaxPoolSize&lt;/span>(10);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setQueueCapacity&lt;/span>(25);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">initialize&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> executor;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记方法为异步执行&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">asyncMethod&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 异步处理逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">completedFuture&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;result&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;specificExecutor&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 指定使用特定的执行器&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;threadPoolTaskExecutor&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">asyncMethodWithExecutor&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 使用指定执行器的异步处理&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="线程池配置">线程池配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableScheduling&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 启用定时任务调度功能&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 配置定时任务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>(fixedRate &lt;span style="color:#f92672">=&lt;/span> 5000) &lt;span style="color:#75715e">// 固定速率执行&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>(fixedDelay &lt;span style="color:#f92672">=&lt;/span> 5000) &lt;span style="color:#75715e">// 固定延迟执行&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>(initialDelay &lt;span style="color:#f92672">=&lt;/span> 1000, fixedRate &lt;span style="color:#f92672">=&lt;/span> 5000) &lt;span style="color:#75715e">// 初始延迟后固定速率执行&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Scheduled&lt;/span>(cron &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;0 0 12 * * ?&amp;#34;&lt;/span>) &lt;span style="color:#75715e">// 使用cron表达式&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 自定义线程池配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">ThreadPoolConfig&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Bean&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> ThreadPoolTaskExecutor &lt;span style="color:#a6e22e">threadPoolTaskExecutor&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ThreadPoolTaskExecutor executor &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> ThreadPoolTaskExecutor();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setCorePoolSize&lt;/span>(10); &lt;span style="color:#75715e">// 核心线程数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setMaxPoolSize&lt;/span>(20); &lt;span style="color:#75715e">// 最大线程数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setQueueCapacity&lt;/span>(200); &lt;span style="color:#75715e">// 队列容量&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setKeepAliveSeconds&lt;/span>(60); &lt;span style="color:#75715e">// 线程空闲时间&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setThreadNamePrefix&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;async-&amp;#34;&lt;/span>); &lt;span style="color:#75715e">// 线程名前缀&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setRejectedExecutionHandler&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> ThreadPoolExecutor.&lt;span style="color:#a6e22e">CallerRunsPolicy&lt;/span>()); &lt;span style="color:#75715e">// 拒绝策略&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">initialize&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> executor;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="异步事件处理">异步事件处理&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EventListener&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 标记方法为事件监听器&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EventListener&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">handleContextStart&lt;/span>(ContextStartedEvent event) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 处理事件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@TransactionalEventListener&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 在事务上下文中处理事件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@TransactionalEventListener&lt;/span>(phase &lt;span style="color:#f92672">=&lt;/span> TransactionPhase.&lt;span style="color:#a6e22e">AFTER_COMMIT&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">handleAfterCommit&lt;/span>(CustomEvent event) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 事务提交后处理事件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EventListener&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 异步事件处理&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">handleAsyncEvent&lt;/span>(CustomEvent event) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 异步处理事件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="重试机制">重试机制&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableRetry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 启用重试机制&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@EnableRetry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">RetryConfig&lt;/span> { }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Retryable&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 配置方法重试&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Retryable&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> value &lt;span style="color:#f92672">=&lt;/span> {SQLException.&lt;span style="color:#a6e22e">class&lt;/span>}, &lt;span style="color:#75715e">// 指定异常类型&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> maxAttempts &lt;span style="color:#f92672">=&lt;/span> 3, &lt;span style="color:#75715e">// 最大重试次数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> backoff &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">@Backoff&lt;/span>(delay &lt;span style="color:#f92672">=&lt;/span> 1000) &lt;span style="color:#75715e">// 重试延迟&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">retryableOperation&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 可能失败的操作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Recover&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 重试失败后的恢复方法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Recover&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">recover&lt;/span>(SQLException e) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 处理最终失败的情况&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="并发控制">并发控制&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Lock&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 分布式锁注解（需要集成相关实现，如Redisson）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Lock&lt;/span>(key &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;#userId&amp;#34;&lt;/span>, timeout &lt;span style="color:#f92672">=&lt;/span> 10)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">processUserData&lt;/span>(String userId) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 需要加锁的处理逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 自定义并发限制注解示例&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Target&lt;/span>(ElementType.&lt;span style="color:#a6e22e">METHOD&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Retention&lt;/span>(RetentionPolicy.&lt;span style="color:#a6e22e">RUNTIME&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#a6e22e">@interface&lt;/span> ConcurrencyLimit {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">value&lt;/span>() &lt;span style="color:#66d9ef">default&lt;/span> 10; &lt;span style="color:#75715e">// 并发数限制&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">long&lt;/span> &lt;span style="color:#a6e22e">timeout&lt;/span>() &lt;span style="color:#66d9ef">default&lt;/span> 1000; &lt;span style="color:#75715e">// 超时时间&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="异步任务配置示例">异步任务配置示例&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">AsyncTaskConfig&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Bean&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> AsyncTaskExecutor &lt;span style="color:#a6e22e">taskExecutor&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ThreadPoolTaskExecutor executor &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> ThreadPoolTaskExecutor();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 核心线程配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setCorePoolSize&lt;/span>(10);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setMaxPoolSize&lt;/span>(20);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setQueueCapacity&lt;/span>(100);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 线程配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setThreadNamePrefix&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Async-Task-&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setRejectedExecutionHandler&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> ThreadPoolExecutor.&lt;span style="color:#a6e22e">CallerRunsPolicy&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 等待任务完成配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setWaitForTasksToCompleteOnShutdown&lt;/span>(&lt;span style="color:#66d9ef">true&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> executor.&lt;span style="color:#a6e22e">setAwaitTerminationSeconds&lt;/span>(60);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> executor;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="异步任务使用示例">异步任务使用示例&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">AsyncService&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">asyncMethodWithResult&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread.&lt;span style="color:#a6e22e">sleep&lt;/span>(1000);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">completedFuture&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Async result&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">catch&lt;/span> (InterruptedException e) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">failedFuture&lt;/span>(e);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">asyncMethodWithException&lt;/span>() &lt;span style="color:#66d9ef">throws&lt;/span> Exception {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">throw&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Exception(&lt;span style="color:#e6db74">&amp;#34;Async method exception&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 异步方法组合示例&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">combinedAsyncMethods&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> future1 &lt;span style="color:#f92672">=&lt;/span> asyncMethodWithResult();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> future2 &lt;span style="color:#f92672">=&lt;/span> asyncMethodWithResult();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">allOf&lt;/span>(future1, future2)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">thenApply&lt;/span>(v &lt;span style="color:#f92672">-&amp;gt;&lt;/span> future1.&lt;span style="color:#a6e22e">join&lt;/span>() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34; &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> future2.&lt;span style="color:#a6e22e">join&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="最佳实践建议">最佳实践建议&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 1. 异常处理&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">asyncWithExceptionHandling&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 异步处理逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">completedFuture&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;result&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#66d9ef">catch&lt;/span> (Exception e) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">failedFuture&lt;/span>(e);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 2. 超时处理&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> CompletableFuture&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#a6e22e">asyncWithTimeout&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> CompletableFuture.&lt;span style="color:#a6e22e">supplyAsync&lt;/span>(() &lt;span style="color:#f92672">-&amp;gt;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 处理逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#e6db74">&amp;#34;result&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }).&lt;span style="color:#a6e22e">orTimeout&lt;/span>(5, TimeUnit.&lt;span style="color:#a6e22e">SECONDS&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 3. 异步任务进度跟踪&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">@Async&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">asyncWithProgress&lt;/span>(ProgressTracker tracker) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tracker.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 处理逻辑&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tracker.&lt;span style="color:#a6e22e">progress&lt;/span>(50);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 更多处理&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tracker.&lt;span style="color:#a6e22e">complete&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="注意事项">注意事项&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>@Async方法的返回类型：&lt;/p></description></item><item><title>17.SpringBoot</title><link>https://pothos.dpdns.org/posts/17.springboot/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://pothos.dpdns.org/posts/17.springboot/</guid><description>&lt;h1 id="springboot-核心知识体系">SpringBoot 核心知识体系&lt;/h1>
&lt;h2 id="目录">目录&lt;/h2>
&lt;details>
&lt;summary>点击展开目录&lt;/summary>
&lt;ul>
&lt;li>&lt;a href="#springboot-%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB">SpringBoot 核心知识体系&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E7%9B%AE%E5%BD%95">目录&lt;/a>&lt;/li>
&lt;li>&lt;a href="#springboot%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5">SpringBoot基础概念&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#springboot%E7%AE%80%E4%BB%8B">SpringBoot简介&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#springboot%E6%A0%B8%E5%BF%83%E7%90%86%E5%BF%B5">SpringBoot核心理念&lt;/a>&lt;/li>
&lt;li>&lt;a href="#springboot%E4%BC%98%E5%8A%BF">SpringBoot优势&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E6%A0%B8%E5%BF%83%E7%89%B9%E6%80%A7">核心特性&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E8%B5%B7%E6%AD%A5%E4%BE%9D%E8%B5%96starter-dependencies">起步依赖（Starter Dependencies）&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%B8%B8%E7%94%A8starter%E5%AF%B9%E6%AF%94%E8%A1%A8">常用Starter对比表&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E7%89%88%E6%9C%AC%E6%BC%94%E8%BF%9B">版本演进&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#springboot%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2">SpringBoot版本历史&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%89%88%E6%9C%AC%E9%80%89%E6%8B%A9%E5%BB%BA%E8%AE%AE">版本选择建议&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E4%B8%8Espring-framework%E5%85%B3%E7%B3%BB">与Spring Framework关系&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%9E%B6%E6%9E%84%E5%85%B3%E7%B3%BB%E5%9B%BE">架构关系图&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%85%B3%E7%B3%BB%E8%AF%B4%E6%98%8E">关系说明&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8">快速入门&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA">环境搭建&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82">开发环境要求&lt;/a>&lt;/li>
&lt;li>&lt;a href="#maven%E9%85%8D%E7%BD%AE">Maven配置&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%88%9B%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%BA%94%E7%94%A8">创建第一个应用&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E4%B8%BB%E5%90%AF%E5%8A%A8%E7%B1%BB">主启动类&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%AC%AC%E4%B8%80%E4%B8%AAcontroller">第一个Controller&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%BF%90%E8%A1%8C%E5%BA%94%E7%94%A8">运行应用&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E8%AF%A6%E8%A7%A3">项目结构详解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%A0%87%E5%87%86%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84">标准项目结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%8C%85%E7%BB%93%E6%9E%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">包结构最佳实践&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3">配置文件详解&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#applicationyml%E9%85%8D%E7%BD%AE">application.yml配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%A4%9A%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE">多环境配置&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%9C%BA%E5%88%B6">自动配置机制&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%9D%A1%E4%BB%B6%E6%B3%A8%E8%A7%A3">条件注解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7">配置属性&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%B3%A8%E8%A7%A3%E4%BD%93%E7%B3%BB">注解体系&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%A0%B8%E5%BF%83%E6%B3%A8%E8%A7%A3">核心注解&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#web%E5%BC%80%E5%8F%91">Web开发&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#rest%E6%8E%A5%E5%8F%A3">REST接口&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86">异常处理&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE">数据访问&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#jpa%E9%85%8D%E7%BD%AE">JPA配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86">事务管理&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6">安全框架&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#spring-security%E9%85%8D%E7%BD%AE">Spring Security配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#jwt%E6%94%AF%E6%8C%81">JWT支持&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%BE%AE%E6%9C%8D%E5%8A%A1">微服务&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C">服务注册&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7">熔断降级&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">最佳实践&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84">项目结构&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">配置最佳实践&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E4%B8%8E%E5%8E%9F%E7%90%86">启动流程与原理&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E8%AF%A6%E8%A7%A3">启动流程详解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E5%8E%9F%E7%90%86">自动配置原理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%9D%A1%E4%BB%B6%E6%B3%A8%E8%A7%A3%E8%AF%A6%E8%A7%A3">条件注解详解&lt;/a>&lt;/li>
&lt;li>&lt;a href="#meta-infspringfactories%E9%85%8D%E7%BD%AE">META-INF/spring.factories配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E7%BB%91%E5%AE%9A">配置属性绑定&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E7%BB%91%E5%AE%9A%E7%A4%BA%E4%BE%8B">配置属性绑定示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E4%BD%BF%E7%94%A8">配置属性使用&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98">常见面试题&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5%E9%9D%A2%E8%AF%95%E9%A2%98">基础概念面试题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%9D%A2%E8%AF%95%E9%A2%98">自动配置面试题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#web%E5%BC%80%E5%8F%91%E9%9D%A2%E8%AF%95%E9%A2%98">Web开发面试题&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6">测试框架&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95">单元测试&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95">集成测试&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%88%87%E7%89%87%E6%B5%8B%E8%AF%95">切片测试&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%88%87%E7%89%87%E6%B5%8B%E8%AF%95-1">切片测试&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E9%AB%98%E7%BA%A7%E7%89%B9%E6%80%A7">高级特性&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6">缓存机制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E5%A4%84%E7%90%86">异步处理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8B%E4%BB%B6%E6%9C%BA%E5%88%B6">事件机制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%BC%82%E6%AD%A5%E5%A4%84%E7%90%86-1">异步处理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BA%8B%E4%BB%B6%E6%9C%BA%E5%88%B6-1">事件机制&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%9B%91%E6%8E%A7%E4%B8%8E%E7%AE%A1%E7%90%86">监控与管理&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%83%A8%E7%BD%B2%E4%B8%8E%E8%BF%90%E7%BB%B4">部署与运维&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E6%89%93%E5%8C%85%E4%B8%8E%E9%83%A8%E7%BD%B2">打包与部署&lt;/a>&lt;/li>
&lt;li>&lt;a href="#dockerfile%E7%A4%BA%E4%BE%8B">Dockerfile示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#docker-compose%E7%A4%BA%E4%BE%8B">Docker Compose示例&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%94%9F%E4%BA%A7%E7%BA%A7dockerfile">生产级Dockerfile&lt;/a>&lt;/li>
&lt;li>&lt;a href="#kubernetes%E9%83%A8%E7%BD%B2%E9%85%8D%E7%BD%AE">Kubernetes部署配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#cicd-pipeline%E9%85%8D%E7%BD%AE">CI/CD Pipeline配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%9B%91%E6%8E%A7%E5%92%8C%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE">监控和日志配置&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%BF%90%E7%BB%B4%E8%84%9A%E6%9C%AC">运维脚本&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">常见问题与解决方案&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E9%85%8D%E7%BD%AE%E9%97%AE%E9%A2%98">配置问题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%BE%9D%E8%B5%96%E9%97%AE%E9%A2%98">依赖问题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98">性能问题&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#debug-%E6%A8%A1%E5%BC%8F%E6%80%A7%E8%83%BD%E5%8D%A1%E9%A1%BF%E6%8E%92%E6%9F%A5">Debug 模式性能卡顿排查&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">安全问题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%83%A8%E7%BD%B2%E9%97%AE%E9%A2%98">部署问题&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98-1">性能问题&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%8F%82%E8%80%83%E8%B5%84%E6%BA%90">参考资源&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3">官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E7%A4%BE%E5%8C%BA%E8%B5%84%E6%BA%90">社区资源&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B9%A6%E7%B1%8D%E6%8E%A8%E8%8D%90">书籍推荐&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%85%A5%E9%97%A8%E7%BA%A7%E4%B9%A6%E7%B1%8D">入门级书籍&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E8%BF%9B%E9%98%B6%E7%BA%A7%E4%B9%A6%E7%B1%8D">进阶级书籍&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%A6%E7%B1%8D">源码分析书籍&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E5%AD%A6%E4%B9%A0%E8%B7%AF%E5%BE%84%E5%BB%BA%E8%AE%AE">学习路径建议&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E5%AE%9E%E8%B7%B5%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90">实践项目推荐&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#%E5%88%9D%E7%BA%A7%E9%A1%B9%E7%9B%AE">初级项目&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E4%B8%AD%E7%BA%A7%E9%A1%B9%E7%9B%AE">中级项目&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E9%AB%98%E7%BA%A7%E9%A1%B9%E7%9B%AE">高级项目&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E8%AE%A4%E8%AF%81%E8%80%83%E8%AF%95">认证考试&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA">技术社区&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%E6%8C%81%E7%BB%AD%E5%AD%A6%E4%B9%A0%E5%BB%BA%E8%AE%AE">持续学习建议&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#%E6%96%87%E6%A1%A3%E6%80%BB%E7%BB%93">文档总结&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#-%E7%9F%A5%E8%AF%86%E8%A6%86%E7%9B%96%E8%8C%83%E5%9B%B4">📚 知识覆盖范围&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-%E6%96%87%E6%A1%A3%E7%89%B9%E8%89%B2">🎯 文档特色&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE">🚀 使用建议&lt;/a>&lt;/li>
&lt;li>&lt;a href="#-%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0">📈 持续更新&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/details>
&lt;h2 id="springboot基础概念">SpringBoot基础概念&lt;/h2>
&lt;h3 id="springboot简介">SpringBoot简介&lt;/h3>
&lt;p>&lt;strong>SpringBoot&lt;/strong>是由Pivotal团队提供的全新框架，其设计目的是用来&lt;strong>简化Spring应用的初始搭建以及开发过程&lt;/strong>。SpringBoot采用了&lt;strong>约定优于配置&lt;/strong>的理念，大量的自动配置减少了开发人员的工作量。&lt;/p></description></item></channel></rss>