<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>上海羊羽卓进出口贸易有限公司</title><link>http://www.sxkekun.com/</link><description></description><item><title>🔴 动态代理（JDK vs CGLIB）核心原理与面试考点精讲【AI助手She深度整理】</title><link>http://www.sxkekun.com/a/7177.html</link><description>&lt;p&gt;&lt;span&gt;在Java开发中，有一个知识点既是设计模式的经典案例，也是Spring AOP的底层基石，面试时几乎必问、工作中每天都在用——它就是&lt;/span&gt;&lt;strong&gt;&lt;span&gt;动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。然而很多学习者只会在框架里配置，搞不清JDK动态代理和CGLIB到底有什么区别，更说不透“为什么JDK只能代理接口”背后的原理。本文围绕AI助手She整理的JDK动态代理与CGLIB两大核心方案，从静态代理痛点切入，讲解两种代理方式的原理差异、适用场景、代码示例和面试高频题，帮助读者彻底掌握动态代理的全链路知识。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;一、痛点切入：为什么需要动态代理&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://img.ddooo.com/uppic/220908/202209081114576998.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;假设我们要给一个用户服务类的方法添加日志功能。最简单的做法是直接在方法里加&lt;/span&gt;&lt;code&gt;System.out.println&lt;/code&gt;&lt;span&gt;，但这种方式会污染核心业务代码，而且每新增一个方法都要重复写一遍。来看静态代理是如何实现的：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 业务接口&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;img src=&quot;http://img.ddooo.com/uppic/231020/202310201450108283.jpg&quot;&gt;&lt;/p&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 目标类（真正的业务逻辑）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceImpl&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;注册用户&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;登录用户&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 静态代理类——手写！每个接口都要单独写一个&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceProxy&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceProxy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;〖前置〗记录日志&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;〖后置〗结束日志&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;〖前置〗记录日志&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;〖后置〗结束日志&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;静态代理存在三大致命问题：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;类爆炸&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：每个被代理的接口都需要手动编写一个代理类。当系统有UserService、OrderService、ProductService等多个接口时，代理类数量会急剧膨胀&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;代码冗余&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：日志、事务、权限等横切逻辑在每一个代理类中重复出现，维护成本极高&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;扩展性差&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：当接口新增方法时，目标类和代理类都需要同步修改，违反开闭原则&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span&gt;这些痛点的根源在于：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;代理类需要开发者提前手动编写，无法在运行时自动生成&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。而动态代理的出现，正是为了解决这一问题——它让代理类在运行时由JVM动态生成，开发者只需要写一次增强逻辑即可&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;二、核心概念：JDK动态代理（概念A）&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;2.1 标准定义&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;JDK动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（Java Development Kit Dynamic Proxy）是Java标准库提供的动态代理实现，从JDK 1.3版本开始引入，位于&lt;/span&gt;&lt;code&gt;java.lang.reflect&lt;/code&gt;&lt;span&gt;包中&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.40191px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。它的核心机制是：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;在运行时动态生成一个实现了指定接口的代理类，并将所有方法调用转发给&lt;/span&gt;&lt;code&gt;InvocationHandler&lt;/code&gt;&lt;span&gt;统一处理&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.7691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;54&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;2.2 核心三组件&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;JDK动态代理依赖三大核心组件&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.7691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;54&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:184px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;组件&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;作用&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;生活类比&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;接口&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;定义代理对象的行为规范&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;演员的剧本&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;InvocationHandler&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;代理逻辑的控制中心，实现&lt;/span&gt;&lt;code&gt;invoke()&lt;/code&gt;&lt;span&gt;方法&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;导演的调度室&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;Proxy&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;通过&lt;/span&gt;&lt;code&gt;newProxyInstance()&lt;/code&gt;&lt;span&gt;动态生成代理实例&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;选角导演&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;2.3 工作原理&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;JDK动态代理的底层工作流程如下：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;调用&lt;/span&gt;&lt;code&gt;Proxy.newProxyInstance(ClassLoader, interfaces, handler)&lt;/code&gt;&lt;span&gt;，传入类加载器、接口数组和&lt;/span&gt;&lt;code&gt;InvocationHandler&lt;/code&gt;&lt;span&gt;实例&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;Proxy类在内存中动态生成一个实现所有指定接口的代理类字节码（类名形如&lt;/span&gt;&lt;code&gt;$Proxy0&lt;/code&gt;&lt;span&gt;），该类继承了&lt;/span&gt;&lt;code&gt;Proxy&lt;/code&gt;&lt;span&gt;基类&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;代理类中所有接口方法的实现都会调用&lt;/span&gt;&lt;code&gt;InvocationHandler.invoke()&lt;/code&gt;&lt;span&gt;方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;在&lt;/span&gt;&lt;code&gt;invoke()&lt;/code&gt;&lt;span&gt;方法中，开发者可以编写增强逻辑（日志、事务、权限等），再通过反射调用目标对象的原始方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;核心机制是“反射 + Proxy”&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ：利用反射在运行时获取方法信息，通过Proxy类动态生成代理字节码&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;三、关联概念：CGLIB动态代理（概念B）&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;3.1 标准定义&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;CGLIB&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（Code Generation Library，代码生成库）是一个开源的、高性能的Java字节码生成库，它通过在运行时动态生成目标类的子类来实现动态代理&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.69878px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;62&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。CGLIB弥补了JDK动态代理的局限性，可以代理没有实现接口的普通类。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;3.2 核心组件与原理&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;CGLIB的核心组件包括&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.69878px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;62&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Enhancer&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：增强器类，负责配置和生成代理对象。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;MethodInterceptor&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：方法拦截器接口，开发者实现其&lt;/span&gt;&lt;code&gt;intercept()&lt;/code&gt;&lt;span&gt;方法来编写增强逻辑。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;CGLIB的工作原理是&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.93316px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;64&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;通过ASM字节码处理框架在内存中动态生成目标类的子类。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;代理子类会&lt;/span&gt;&lt;strong&gt;&lt;span&gt;重写&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;父类中的所有非final方法。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;在重写的方法中，调用&lt;/span&gt;&lt;code&gt;MethodInterceptor.intercept()&lt;/code&gt;&lt;span&gt;执行增强逻辑。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;通过&lt;/span&gt;&lt;code&gt;proxy.invokeSuper()&lt;/code&gt;&lt;span&gt;调用父类（目标类）的原始方法。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;注意&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：由于CGLIB基于继承实现，它无法代理被&lt;/span&gt;&lt;code&gt;final&lt;/code&gt;&lt;span&gt;修饰的类或方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;四、概念关系与区别：JDK vs CGLIB&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;两种动态代理方案的核心差异总结如下&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:439px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;left: 0px; width: 714.02px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;对比维度&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;JDK动态代理&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;CGLIB动态代理&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;核心原理&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;基于接口，通过反射生成代理类&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;基于继承，通过ASM生成子类&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;实现方式&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt;&lt;span&gt; + &lt;/span&gt;&lt;code&gt;InvocationHandler&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Enhancer&lt;/code&gt;&lt;span&gt; + &lt;/span&gt;&lt;code&gt;MethodInterceptor&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;必要条件&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;目标类&lt;/span&gt;&lt;strong&gt;&lt;span&gt;必须实现至少一个接口&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;无需接口，但类/方法不能是final&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;底层技术&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;反射 + Proxy&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;ASM字节码增强 + FastClass机制&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;依赖库&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Java原生，无需额外依赖&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;需引入CGLIB库（Spring Core已内置）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;代理创建速度&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较快（无需生成字节码）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较慢（需动态生成字节码）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;方法调用性能&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;JDK 8以前较慢；JDK 8+优化后差距缩小&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;快（通过FastClass索引调用，避免反射开销）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;典型应用场景&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Spring AOP代理有接口的Bean&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Spring AOP代理无接口的Bean&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;一句话概括&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK动态代理是“&lt;/span&gt;&lt;strong&gt;&lt;span&gt;面向接口的代理方案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;”，CGLIB是“&lt;/span&gt;&lt;strong&gt;&lt;span&gt;面向类的代理方案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;”——前者是Java原生轻量级方案，后者是功能更强大的字节码增强方案。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;五、代码示例：极简实现与流程解析&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;5.1 JDK动态代理示例&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 1. 定义接口（必须！）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 2. 目标类实现接口&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceImpl&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;添加用户：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 3. 实现InvocationHandler（增强逻辑写在这里）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LogHandler&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;InvocationHandler&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LogHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; proxy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Method&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【前置】方法：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 反射调用目标方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【后置】方法执行完毕&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 4. 使用Proxy.newProxyInstance创建代理对象&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceImpl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; proxy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Proxy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newProxyInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClassLoader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getInterfaces&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LogHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        proxy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;张三&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;执行流程&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：调用&lt;/span&gt;&lt;code&gt;proxy.addUser()&lt;/code&gt;&lt;span&gt; → 代理类自动转发到&lt;/span&gt;&lt;code&gt;LogHandler.invoke()&lt;/code&gt;&lt;span&gt; → 执行前置增强 → 通过&lt;/span&gt;&lt;code&gt;method.invoke()&lt;/code&gt;&lt;span&gt;反射调用目标对象方法 → 执行后置增强 → 返回结果&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.32378px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;15&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;5.2 CGLIB动态代理示例&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 1. 目标类（无需实现接口）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;添加用户：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 2. 实现MethodInterceptor&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LogInterceptor&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MethodInterceptor&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;intercept&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Method&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MethodProxy&lt;/span&gt; proxy&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【前置】方法：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; proxy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;invokeSuper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 调用父类原始方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【后置】方法执行完毕&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 3. 使用Enhancer创建代理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;Enhancer&lt;/span&gt; enhancer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Enhancer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        enhancer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setSuperclass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        enhancer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LogInterceptor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; proxy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; enhancer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        proxy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;张三&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;执行流程&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：调用&lt;/span&gt;&lt;code&gt;proxy.addUser()&lt;/code&gt;&lt;span&gt; → 实际调用的是CGLIB生成的子类重写方法 → 子类方法内部调用&lt;/span&gt;&lt;code&gt;LogInterceptor.intercept()&lt;/code&gt;&lt;span&gt; → 执行增强逻辑 → 通过&lt;/span&gt;&lt;code&gt;proxy.invokeSuper()&lt;/code&gt;&lt;span&gt;调用父类原始方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.93316px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;64&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;六、底层原理与技术支撑&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;6.1 JDK动态代理的底层依赖：反射&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;JDK动态代理的核心底层依赖是&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Java反射机制（Reflection）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 。反射允许程序在运行时获取类的结构信息（类名、方法、字段等），并动态调用方法、创建对象&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;性能特点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：反射调用（如&lt;/span&gt;&lt;code&gt;Method.invoke()&lt;/code&gt;&lt;span&gt;）通常比直接调用慢5到50倍，主要开销来自安全检查、装箱/拆箱、间接分派以及无法进行静态内联优化&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。JDK 8及后续版本对反射机制进行了持续优化，性能差距已显著缩小&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;为什么JDK动态代理只能代理接口？&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;因为Proxy机制底层生成的代理类（如&lt;/span&gt;&lt;code&gt;$Proxy0&lt;/code&gt;&lt;span&gt;）继承了&lt;/span&gt;&lt;code&gt;java.lang.reflect.Proxy&lt;/code&gt;&lt;span&gt;类，而Java不支持多重继承，因此代理类无法再继承目标具体类，只能通过实现接口的方式来提供方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.48785px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;41&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;6.2 CGLIB的底层依赖：ASM字节码框架&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;CGLIB的底层依赖是&lt;/span&gt;&lt;strong&gt;&lt;span&gt;ASM字节码处理框架&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，这是一个小且快的Java字节码操作库，能够直接读写Java类的字节码。ASM允许CGLIB在运行时解析、修改和生成新的.class文件&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.69878px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;62&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;FastClass机制——CGLIB的性能秘籍&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;br&gt;&lt;span&gt;CGLIB通过FastClass机制避免反射调用带来的性能损耗。具体做法是：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;为目标类和代理类分别生成一个FastClass文件。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;FastClass包含方法名到整数索引的映射表。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;方法调用时通过索引直接调用，类似数组下标访问，绕过了反射的开销&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.61285px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;65&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;代价&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：CGLIB生成代理时需要生成三份字节码文件（代理类 + 目标类FastClass + 代理类FastClass），以空间换时间&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;七、高频面试题与参考答案&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;面试题1：JDK动态代理和CGLIB动态代理有什么区别？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（踩分点：原理 + 条件 + 性能 + 应用）：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;实现原理不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK动态代理基于接口，通过反射和Proxy类生成代理类；CGLIB基于继承，通过ASM字节码框架生成目标类的子类。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;使用条件不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK要求目标类必须实现接口；CGLIB不要求接口，但无法代理final类或final方法。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;性能表现不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK生成代理对象更快，但早期版本反射调用开销较大；JDK 8+优化后两者差距缩小。CGLIB生成代理对象较慢，但运行时调用效率更高（通过FastClass机制）。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;依赖不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK是Java原生支持，无额外依赖；CGLIB需要引入第三方库（Spring Boot 3.x默认内置）。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Spring AOP中的选择策略&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：Spring默认优先使用JDK动态代理；当目标Bean没有实现接口时，自动降级为CGLIB&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.40972px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;37&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;span&gt;面试题2：Spring AOP的底层实现原理是什么？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring AOP的核心实现依赖于&lt;/span&gt;&lt;strong&gt;&lt;span&gt;动态代理技术&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。当容器启动时，Spring会根据目标Bean是否实现接口来选择合适的代理方式：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;若目标Bean实现了接口，Spring默认使用&lt;/span&gt;&lt;strong&gt;&lt;span&gt;JDK动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，生成一个实现相同接口的代理对象。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;若目标Bean没有实现接口，Spring使用&lt;/span&gt;&lt;strong&gt;&lt;span&gt;CGLIB&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，通过生成目标类的子类来创建代理对象。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;代理对象会拦截目标方法的调用，在方法执行前后织入增强逻辑（如@Before、@After、@Around等），从而实现横切关注点与业务逻辑的解耦&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.7691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;54&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题3：为什么JDK动态代理只能代理接口？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（踩分点：继承限制 + Proxy源码分析）：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;JDK动态代理生成的代理类（如&lt;/span&gt;&lt;code&gt;$Proxy0&lt;/code&gt;&lt;span&gt;）会继承&lt;/span&gt;&lt;code&gt;java.lang.reflect.Proxy&lt;/code&gt;&lt;span&gt;类。由于Java不支持多重继承，该代理类无法再继承目标具体类，因此只能通过实现接口的方式来提供被代理的方法。如果传入一个没有实现接口的类，&lt;/span&gt;&lt;code&gt;Proxy.newProxyInstance()&lt;/code&gt;&lt;span&gt;会抛出&lt;/span&gt;&lt;code&gt;IllegalArgumentException: interface is required&lt;/code&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.48785px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;41&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题4：CGLIB能否代理final类？为什么？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;CGLIB&lt;/span&gt;&lt;strong&gt;&lt;span&gt;无法代理final类&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，也无法代理final方法。因为CGLIB的实现原理是动态生成目标类的子类，通过继承和重写方法来达到代理目的。final类不能被继承，final方法不能被重写，因此CGLIB无法对它们进行代理&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.69878px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;62&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题5：动态代理和静态代理的区别是什么？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:301px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;对比维度&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;静态代理&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;动态代理&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;代理类生成时机&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;编译期由开发者手动编写&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;运行时由JVM/字节码框架动态生成&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;代码量&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;每个目标类需单独编写代理类&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;只需编写一次InvocationHandler/MethodInterceptor&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;灵活性&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;差，新增方法需修改代理类&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;好，可统一处理所有方法&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;维护成本&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;高，接口越多代理类越多&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;低，横切逻辑集中管理&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;性能&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;直接调用，无额外开销&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;有反射或字节码调度的微小开销&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;一句话总结：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;静态代理在编译期“写死”代理关系，动态代理在运行时“生成”代理关系&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.7691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;45&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;八、总结&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;本文围绕Java动态代理，从静态代理的痛点出发，依次讲解了：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;JDK动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：Java原生方案，基于接口 + 反射 + Proxy，轻量但要求目标类必须实现接口。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;CGLIB动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：第三方方案，基于继承 + ASM字节码生成，功能强大但不支持final类/方法。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;核心区别&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK是“面向接口的代理”，CGLIB是“面向类的代理”；底层分别依赖反射和字节码增强。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;底层原理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK依赖反射调用，CGLIB依赖FastClass索引调用以优化性能。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Spring AOP应用&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：根据目标Bean是否有接口自动选择代理方式。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;记忆口诀&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：接口优先JDK，无接口用CGLIB；final方法别代理，反射性能已优化。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;后续文章将继续深入Spring AOP的源码实现，讲解代理选择策略的底层判断逻辑，以及如何通过配置强制指定代理方式。欢迎持续关注！&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 17:54:02 +0800</pubDate></item><item><title>📅 2026年4月  皮皮AI助手带你深度拆解Spring最核心的两大概念</title><link>http://www.sxkekun.com/a/7176.html</link><description>&lt;p&gt;&lt;span&gt;在Java企业级开发中，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Spring框架&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 无疑占据着举足轻重的地位。无论是求职面试、技术进阶还是日常开发，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;控制反转（Inversion of Control，简称IoC）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 与 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;依赖注入（Dependency Injection，简称DI）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 都是绕不开的核心知识点。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;许多开发者存在一个普遍痛点：项目里 &lt;/span&gt;&lt;code&gt;@Service&lt;/code&gt;&lt;span&gt;、&lt;/span&gt;&lt;code&gt;@Autowired&lt;/code&gt;&lt;span&gt; 用得得心应手，但被问到“IoC 和 DI 到底有什么区别”时，却说不出所以然，面试时也往往因此失分。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://n.sinaimg.cn/sinacn20190926ac/157/w640h1117/20190926/df57-ifaench5811006.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;本文将从痛点切入，由浅入深拆解 IoC 与 DI 的本质，配合代码示例与底层原理，帮你建立完整知识链路，轻松应对面试。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;一、痛点切入：为什么我们需要 IoC 和 DI？&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://p0.ifengimg.com/pmop/2018/0510/E2584DFF14B80D7956F3A042380E350AB672E921_size27_w640_h440.jpeg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;传统开发中，若类 A 需要依赖类 B，通常的做法是在 A 内部通过 &lt;/span&gt;&lt;code&gt;new B()&lt;/code&gt;&lt;span&gt; 直接创建 B 的实例&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 传统开发方式 —— 紧耦合&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 硬编码依赖具体实现&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; payment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AlipayService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Logger&lt;/span&gt; logger &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FileLogger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/logs/app.log&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;processOrder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        payment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;// 想换成微信支付？需要改代码并重新编译！&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;订单处理完成&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;这种方式看似直观，实际却隐藏着致命缺陷：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;耦合度高&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;code&gt;OrderService&lt;/code&gt;&lt;span&gt; 与 &lt;/span&gt;&lt;code&gt;AlipayService&lt;/code&gt;&lt;span&gt; 直接绑定，更换支付渠道必须修改源代码&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;扩展性差&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：新增支付方式需要改代码、重编译、再部署&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;维护困难&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：当 &lt;/span&gt;&lt;code&gt;AlipayService&lt;/code&gt;&lt;span&gt; 本身又依赖其他对象时，开发者需要在调用链上层层创建依赖，代码逐渐失控&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;难以测试&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：单元测试中无法轻易用 Mock 对象替换真实支付服务&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;为了解决这些问题，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;IoC（控制反转）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 的设计思想应运而生。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;二、核心概念讲解：IoC（控制反转）&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：IoC 全称 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;Inversion of Control&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，中文译为“控制反转”，是一种设计原则，其核心思想是将对象的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;创建权&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;和&lt;/span&gt;&lt;strong&gt;&lt;span&gt;生命周期管理权&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;从程序代码中剥离，交由外部容器（如 Spring 容器）统一接管&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;拆解关键词，其核心含义是：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;“反转了什么？”&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;正转（传统模式）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ：对象主动去创建或查找自己所依赖的其他对象&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;反转（IoC 模式）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ：对象只需声明自己“需要什么”，由外部容器主动将依赖提供给它&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;生活化类比&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：传统开发模式就像“自己在家做饭”，你得亲自买菜、洗菜、切菜、下锅，从头包揽全部工序。而 IoC 模式则像“点外卖”，你只需告诉商家“我要什么”，商家就会完成所有工作，直接把成品送到你面前——你不用关心食材从哪里来、厨师是谁，只专注“吃”这件事就好。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;IoC 的价值&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：代码不再需要直接管理依赖对象的创建细节，模块间的硬编码耦合被彻底消除，组件复用性和可测试性大幅提升。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;三、关联概念讲解：DI（依赖注入）&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：DI 全称 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;Dependency Injection&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，中文译为“依赖注入”，是一种设计模式，是 IoC 思想最主流的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;具体实现方式&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。由容器动态地将依赖对象“注入”到目标对象中&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;简单来说：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;IoC 是“想法”，DI 是“做法”&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring 提供了三种主要的依赖注入方式&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:228px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;left: 0px; width: 744.084px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;注入方式&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;示例&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;特点&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;构造器注入&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;public UserService(UserDao dao) { this.userDao = dao; }&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;依赖不可变、易于测试，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Spring 官方推荐&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;Setter 注入&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;@Autowired public void setUserDao(UserDao dao) { this.userDao = dao; }&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;可选依赖、可重新配置&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;字段注入&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;@Autowired private UserDao userDao;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;写法简洁，但不推荐（难以测试、破坏封装）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2&gt;&lt;span&gt;四、概念关系与区别总结&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;一句话记住二者的关系&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;IoC 是一种设计思想，DI 是实现这种思想的具体手段&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;——Spring 通过 DI 机制来实现 IoC&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.91753px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;34&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:230px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;维度&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;IoC（控制反转）&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;DI（依赖注入）&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;本质&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;设计思想 / 设计原则&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;设计模式 / 具体实现&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;关注点&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;“谁来控制”（控制权归属）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;“如何注入”（依赖如何传递）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;作用&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;定义容器接管对象管理的理念&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;实现依赖关系动态传递的技术&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;类比&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;“找外卖平台帮你安排餐食”的想法&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;“骑手把饭菜送到你手中”的具体动作&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2&gt;&lt;span&gt;五、代码示例：从传统方式到 IoC + DI 的演进&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;🔴 传统方式（紧耦合）&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// OrderService 直接创建依赖对象，硬编码具体实现&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; payment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AlipayService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;// 写死了&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Logger&lt;/span&gt; logger &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FileLogger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/logs/app.log&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        payment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;完成&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;🟢 引入 IoC + DI 后的代码&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 步骤1：将组件交给 Spring 容器管理（通过注解声明）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Service&lt;/span&gt;                                 &lt;span class=&quot;token comment&quot;&gt;// 声明为 Spring Bean&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 步骤2：声明依赖关系，由 Spring 自动注入&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;                           &lt;span class=&quot;token comment&quot;&gt;// 告诉容器：我需要 PaymentService&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; payment&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 不关心具体实现，面向接口编程&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Autowired&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Logger&lt;/span&gt; logger&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        payment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;                   &lt;span class=&quot;token comment&quot;&gt;// 具体是支付宝还是微信，由容器决定&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        logger&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;完成&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token comment&quot;&gt;// 其他组件同样通过注解注册&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Service&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;AlipayService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Service&lt;/span&gt;  &lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WechatPayService&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PaymentService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;改进效果&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;OrderService&lt;/code&gt;&lt;span&gt; 不再自己创建依赖，只声明“我需要什么”&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;具体使用哪个 &lt;/span&gt;&lt;code&gt;PaymentService&lt;/code&gt;&lt;span&gt; 实现，可由配置决定，业务代码无需改动&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;单元测试时可以轻松注入 Mock 对象&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;&lt;span&gt;六、底层原理：IoC 容器的核心支撑&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;Spring IoC 容器的底层实现主要依赖以下关键技术&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.33941px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;27&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;1. 容器核心架构&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;BeanFactory&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：Spring 最基础的 IoC 容器，提供最基本的依赖注入支持（懒加载）&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;ApplicationContext&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：BeanFactory 的子接口，提供更多企业级功能（国际化、事件发布等），默认预加载单例 Bean&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;DefaultListableBeanFactory&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：Spring 中 IoC 容器的核心实现类，几乎所有容器都基于它构建&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;2. Bean 的生命周期管理&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring 容器管理 Bean 的完整生命周期：实例化 → 属性赋值 → 初始化 → 销毁&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。关键流程包括：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;通过 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;BeanDefinition&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 描述 Bean 的元数据（类名、作用域、初始化方法等）&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;默认使用 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;反射机制&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 调用构造函数创建对象实例&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;通过 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;BeanPostProcessor&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 接口提供扩展点，允许在初始化前后插入自定义逻辑&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;通过 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;AutowiredAnnotationBeanPostProcessor&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 处理 &lt;/span&gt;&lt;code&gt;@Autowired&lt;/code&gt;&lt;span&gt; 等注解的依赖注入&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;3. 三级缓存解决循环依赖&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;对于 Setter 注入的循环依赖，Spring 通过&lt;/span&gt;&lt;strong&gt;&lt;span&gt;三级缓存&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;机制优雅解决：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;singletonFactories&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（三级缓存）：存放原始对象工厂&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;earlySingletonObjects&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（二级缓存）：存放提前暴露的原始对象&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;singletonObjects&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;（一级缓存）：存放完全初始化后的 Bean&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;💡 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;注意&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：构造器注入的循环依赖无法通过该机制解决，会抛出 &lt;/span&gt;&lt;code&gt;BeanCurrentlyInCreationException&lt;/code&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.33941px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;27&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;七、高频面试题与参考答案&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;Q1：解释什么是 IoC（控制反转）？什么是 DI（依赖注入）？两者的关系是什么？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;IoC（Inversion of Control，控制反转）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 是一种设计思想，将对象的创建和生命周期管理权从程序代码转移给外部容器，实现模块间的解耦。 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;DI（Dependency Injection，依赖注入）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 是实现 IoC 的具体方式，由容器在运行时动态地将依赖对象注入到目标对象中。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;二者的关系&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：IoC 是思想，DI 是实现手段。Spring 框架通过 DI 机制来落地 IoC 设计思想&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.85503px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;30&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;Q2：Spring 中有几种依赖注入方式？哪种是官方推荐的？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring 提供了三种依赖注入方式：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;构造器注入&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;、&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Setter 注入&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 和 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;字段注入&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;strong&gt;&lt;span&gt;构造器注入&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 是 Spring 官方推荐的方式，因为它能保证依赖的不可变性（使用 &lt;/span&gt;&lt;code&gt;final&lt;/code&gt;&lt;span&gt; 修饰），且使 Bean 在构造完成后即可完全初始化，也更易于单元测试。字段注入虽然写法简洁，但存在破坏封装、测试困难等问题，不推荐使用&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.47222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;31&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;Q3：BeanFactory 和 ApplicationContext 有什么区别？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;ApplicationContext&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 是 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;BeanFactory&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 的子接口，主要区别在于：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;加载方式不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：BeanFactory 采用懒加载，Bean 在使用时才初始化；ApplicationContext 启动时预加载所有单例 Bean&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;功能扩展不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：ApplicationContext 提供国际化（&lt;/span&gt;&lt;code&gt;MessageSource&lt;/code&gt;&lt;span&gt;）、事件发布（&lt;/span&gt;&lt;code&gt;ApplicationEventPublisher&lt;/code&gt;&lt;span&gt;）、AOP 集成等企业级功能，BeanFactory 不具备这些能力&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;使用场景不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：BeanFactory 适用于资源受限的场景，ApplicationContext 是实际开发中的首选&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.91753px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;34&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;hr&gt;&lt;h2&gt;&lt;span&gt;八、结尾总结&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;本文围绕 Spring 两大核心概念 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;IoC（控制反转）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 与 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;DI（依赖注入）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，梳理了以下关键知识点：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;痛点分析&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：传统 &lt;/span&gt;&lt;code&gt;new&lt;/code&gt;&lt;span&gt; 对象方式导致紧耦合、难测试、难扩展&lt;/span&gt;&lt;br&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;核心概念&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：IoC 是设计思想（控制权归属反转），DI 是实现方式（依赖动态注入）&lt;/span&gt;&lt;br&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;注入方式&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：构造器注入（推荐）、Setter 注入、字段注入&lt;/span&gt;&lt;br&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;代码示例&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：从紧耦合演进到 IoC + DI 的完整对比&lt;/span&gt;&lt;br&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;底层原理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：BeanFactory/ApplicationContext 容器架构、反射实例化、BeanPostProcessor、三级缓存&lt;/span&gt;&lt;br&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;面试要点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：概念辨析、注入方式、容器对比等高频考点&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;重点记忆&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：IoC 和 DI 不是一回事——前者是“想法”，后者是“做法”。Spring 通过 DI 实现 IoC，这八个字足以概括二者的关系。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;下一篇将深入讲解 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;Spring Bean 的生命周期与作用域&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，敬请期待！&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;p&gt;&lt;em&gt;&lt;span&gt;📌 本文由 皮皮AI助手 结合网络公开技术资料整理撰写。作为你的专属 AI 编程助手，皮皮AI助手 致力于提供准确、易懂的技术内容。若你有任何技术疑问或希望我深入讲解某个话题，欢迎随时交流！&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 14:45:02 +0800</pubDate></item><item><title>黑谷AI区域代理攻略：我是怎么从月薪三千到月入六位数的？</title><link>http://www.sxkekun.com/a/7175.html</link><description>&lt;p&gt;&lt;span&gt;哎，说实话，去年这时候我还在为房租发愁呢。一个朋友突然跟我提什么黑谷AI区域代理，我第一反应就是：“哥们儿，你是不是被传销洗脑了？”结果他硬拉着我研究了一个月，现在我倒好，天天被问&lt;/span&gt;&lt;strong&gt;&lt;span&gt;黑谷AI如何区域代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，搞得我好像成了半个专家似的。今天就把我踩过的坑、赚到的钱、还有那些没人告诉你的门道，全给你掏心窝子抖搂出来。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;从瞧不起到真香，我就用了三天&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://k.sinaimg.cn/n/sinakd20112/107/w1024h683/20240509/3fa3-fb82c444f3d54153333b4602aa8e5f05.jpg/w700d1q75cms.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我这个人吧，特别犟。当初朋友发来资料，我扫了一眼“AI”两个字就觉得又是割韭菜的。咱小县城做点小生意的人，懂什么人工智能啊？但他第二天直接把我拽到省代理的办公室，那哥们儿打开后台数据给我看——就我们隔壁那个三线城市，上个月光餐饮行业的AI客服系统，流水就干了四十多万。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我当时眼睛都绿了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://k.sinaimg.cn/n/sinakd20115/736/w1024h512/20240723/b5b6-02778eea7b25d52eb1373737cf968eb2.jpg/w700d1q75cms.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;真的，别笑。你知道我们这种普通人最怕什么吗？怕投了钱打水漂。但黑谷AI这个模式有点意思，它不是让你囤货，是卖服务。你想想现在哪个实体店不需要降本增效？就我们楼下那个烧烤店，以前招个前台月薪四千，现在用AI语音接待客人订餐，一个月才几百块，老板省下的钱够再雇个烧烤师傅了。这就是痛点，实打实的痛点。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;黑谷AI如何区域代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，说白了就是给你划块地儿，让你去跟当地的商家谈合作，把这些AI工具卖给他们用。总部负责技术升级和维护，你负责开拓市场和服务客户。我当时琢磨着，这玩意儿只要产品不是太拉胯，就算我不跑业务，招几个人跑也行啊。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;别信什么躺赚，先把地推跑断腿&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;网上那些说“交了代理费就躺赚”的，你可千万别信。我刚开始也傻乎乎地以为，打几个电话发发朋友圈，单子就能自己飞过来。结果头一个月，我连个咨询的人都没有。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;后来我想明白了，这事儿得“不要脸”。我印了一堆资料，专门挑下午两三点——那个时间点老板们一般不太忙，拎着个保温杯就进人家店里。被赶出来过吗？那肯定啊。有个开火锅店的老板直接说“你这种推销的我一天见八个”，但我没走，我说“老板，我不推销，我就问你个事儿，你后厨现在每个月浪费的食材成本有没有两千块？我这有个系统能帮你省一半，你要不要听三分钟？”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;他让我坐下了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你看，这就是门道。&lt;/span&gt;&lt;strong&gt;&lt;span&gt;黑谷AI如何区域代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;的核心不是什么高大上的技术，是你得找到商家的痛点。餐饮店痛浪费、洗车店痛人工高、KTV痛客源不稳定……黑谷AI的产品线几乎覆盖了这些本地生活服务的痛点，你要做的就是把产品翻译成老板听得懂的钱。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我们这边有个方言叫“凑合过”，很多小老板都是这心态——人工高点就高点吧，管理乱点就乱点吧，习惯了。但你真帮他把账算清楚了，没人跟钱过不去。上个月我一个客户，做汽车美容的，用AI管理系统后少雇了两个前台，一年省下近十万，他开心得非要请我洗车。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;那些资料上不会写给你的坑&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;我得说实话，做这个也不是一帆风顺。有件事儿我差点栽大跟头。去年下半年，我一个同行代理在隔壁县签了个连锁酒店的大单子，四十多个房间的AI智能客服系统，合同金额挺可观。结果那哥们儿太想赚钱了，把自己区域的优惠补贴全砸到这个客户身上，导致后面几个月其他小客户的服务跟不上了，退了好几个。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这事儿给我敲了警钟。做代理不是签完合同就完事了，你得平衡资源，不能为了一个大客户把基本盘给丢了。现在我的策略是“二八原则”——八成的精力维护中小客户，两成去啃大客户。因为中小客户虽然单个金额小，但稳定啊，而且口碑传播快。我们这儿是三四线城市，圈子就这么大，你服务好一个烧烤店，他能给你介绍五个同行。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;还有一个坑是技术迭代。AI这东西发展太快了，去年还在主推语音机器人，今年已经升级到视频分析客流、自动生成营销文案了。你得跟着学，否则去跟客户聊的时候一问三不知，人家凭什么信你？我现在每周都逼自己花半天时间看总部的培训资料，虽然枯燥，但真管用。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;咱普通人的机会到底在哪儿？&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;说实话，我特别能理解犹豫的人。我自己也是从小白过来的，最开始连什么叫SaaS都不懂。但现在回头看，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;黑谷AI如何区域代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;这件事，最打动我的一点是什么？是它给了咱们这些没背景、没资金、没技术的“三无人员”一个翻身的机会。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你看啊，传统生意要开店要囤货，动不动几十万砸进去。这个呢，代理费加上启动资金，几万块钱就能干。而且它不是那种一夜暴富的生意，是滚雪球式的——你积累的客户越多，每年的续费就越稳定。我现在手头有一百多个客户，光续费提成每个月就有三万多，加上新签的提成，上个月破了六万。在我们这个小城市，这收入已经超过很多公务员了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;当然，你要说累不累？那肯定累。有时候晚上十点了还在回客户消息，周末也得出去见客户。但这种累跟打工的累不一样，你知道每分钱都是为自己赚的，就有劲儿。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;前两天还有个哥们儿问我，说他自己性格内向，适不适合干这个？我说哥们儿，你别把自己框死了。我刚开始也内向，但当你发现随便聊几句就能帮别人一年省几万块的时候，你自然就敢开口了。这事儿的关键不是你能说会道，是你真觉得手里的东西能帮到人。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;p&gt;&lt;span&gt;好了，上面都是我这小一年的真实经历。我看很多人在评论区问问题，今天我就挑三个典型的，好好聊聊。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“想创业的小王”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;“大哥，我手里只有三万块存款，够不够做黑谷AI的区域代理？启动之后多久能回本啊？”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 小王啊，你这情况跟我当初一模一样，我也是东拼西凑了四万块起步的。说实话，三万的预算稍微有点紧张，但也不是完全不行。咱们把账算明白啊——代理费这块，不同级别的区域费用不一样，你可以先从县级代理或者城市里的某个区开始，别一上来就想着拿整个市，那费用确实高。剩下的一万块左右，你得留五千块当流动资金，比如印资料、跑客户的交通费、请客吃饭啥的，另外五千块是你前三个月的生活费，别把自己逼得太紧。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;回本周期这事儿因人而异，我给你说个保守的。如果你是全职干，每天能跑个三五家客户，第一个月熟悉产品、跑市场，可能就签个一两单，赚个三五千的。第二个月开始上手了，正常能签个五到八单，提成加上前期的续费，月入能到一万出头。我当时的回本周期是四个半月，比我预期快多了。但你要做好前两三个月赚得少的思想准备，千万别借钱去交代理费然后指望第二天就发财，那是赌博不是创业。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“纠结的老李”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;“我现在做建材生意亏了二十多万，想转行但怕又选错赛道。黑谷AI这个到底靠不靠谱？会不会是风口上的泡沫？”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 老李，我特别能理解你的心情。亏过钱的人再做选择，那真是如履薄冰。我这么说吧，任何一个行业都有泡沫的可能性，但AI赋能实体店这事儿，我觉得不是泡沫，是趋势。为什么？你想想咱们身边那些小店，人工越来越贵、年轻人越来越不愿意干服务业、管理成本越来越高，这些问题不会消失，只会越来越严重。黑谷AI提供的解决方案，本质上是在帮这些老板省钱、增效，这是刚需。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;但我要给你泼盆冷水啊，别觉得选对了赛道就一定能赚钱。我见过不少代理做得不好的，问题出在哪儿呢？一个是懒，不愿意出去跑客户，天天坐家里等客上门；另一个是服务跟不上，签完合同就消失，客户第二年肯定不续费。你做过建材生意，应该知道做B端业务的核心是什么——信任和口碑。只要你肯下地推的功夫，把服务质量做起来，这行很难做差。我建议你先别急着交钱，去找你们省的总代理聊聊，看看他们的扶持政策怎么样，最好能跟着老代理跑两天业务，感受一下真实的工作状态，再做决定。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“不想打工的小丽”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;“我是女生，没做过销售，也没技术背景，做这个会不会很吃亏？别人会不会觉得我不专业？”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 小丽，你这个问题问得特别好。我得跟你说个事儿，我们代理群里做得最好的前三名，有两个都是女生。你知道为什么吗？因为跟商家谈合作这件事，女生的耐心和亲和力有时候比男生优势大得多。我刚开始跑业务的时候，五大三粗往人家店里一站，老板都有防备心。但女代理不一样，她们会聊天、会倾听，更容易让老板放下戒备。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;至于没技术背景，这根本不是事儿。我当初连HTML是什么都不知道，现在不也干得好好的？总部会有全套的产品培训，你只要把核心的几个功能——比如AI语音接待、智能营销、数据分析这些——用大白话讲清楚就行。老板们不关心技术原理，只关心“这东西能帮我省多少钱、赚多少钱”。你只要学会算账，就能搞定客户。而且说实话，女性创业者在这行有个天然优势，很多女老板更愿意跟女代理沟通，觉得更有安全感。你只要自信一点，把自己的专业性展现出来，没人会因为性别小瞧你。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 13:21:01 +0800</pubDate></item><item><title>麻将AI助手到底值不值得用？老麻友亲测，看完这篇你就全懂了</title><link>http://www.sxkekun.com/a/7174.html</link><description>&lt;p&gt;&lt;span&gt;哎，说起来你可能不信，我这种逢年过节就被三姑六婆拉上麻将桌凑角的“老选手”，居然也有被高科技震惊到说不出话的一天。事情是这样的，去年春节，我们几个老同学好不容易凑齐一桌，说好了不玩太大，就图个乐呵。结果你猜怎么着？隔壁老张，平时打牌连幺鸡和一条都分不清的那个老张，那天晚上竟然&lt;/span&gt;&lt;strong&gt;&lt;span&gt;杠上开花三连击&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，把把自摸！&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我这暴脾气当时就上来了，心想这老头子是不是学了什么“邪门歪道”？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://k.sinaimg.cn/n/sinakd20240409s/202/w600h402/20240409/6e72-049325e1372f7a413c761efa2daee348.jpg/w700d1q75cms.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;后来才知道，好家伙，人家是在手机上偷偷搞了一个&lt;/span&gt;&lt;strong&gt;&lt;span&gt;麻将AI助手&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，趁我们不注意的时候对着牌局一扫，什么牌该打、该防谁、下家大概听什么牌，人家心里门清儿。那场牌我输得那叫一个“惨绝人寰”啊，连老妈给我准备的红包都搭进去了。但说实话，气归气，我还真被这玩意儿给&lt;/span&gt;&lt;strong&gt;&lt;span&gt;种草&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;了。打那以后，我就开始琢磨研究这玩意到底是个啥原理，有哪些靠谱的，又有哪些是“坑货”。今天趁着这个机会，就跟各位牌友好好掰扯掰扯。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;你是不是也经常这样？&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ——看到手里的牌乱七八糟，拆对子还是留搭子，心里完全没谱。明明听牌了，却不知道到底是听“三六九”还是等“幺鸡”，结果一张牌点出去，直接把下家给喂饱了，人家美滋滋地推倒胡牌，你只能傻眼。其实我之前也是这样的，感觉自己打麻将全靠“祖传玄学”，毫无章法可言。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://k.sinaimg.cn/n/sinakd20240409s/225/w600h425/20240409/f5d8-bbc4de71185ef6bd8ec54cbf110da0c9.jpg/w700d1q75cms.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;直到我&lt;/span&gt;&lt;strong&gt;&lt;span&gt;深入了解了一圈现在的麻将AI工具&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，才算是打开了新世界的大门。说起来你可能不知道，这玩意背后靠的可不是什么算命占卜，而是实打实的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;深度强化学习技术&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。有专业的论文就提到，麻将这东西因为大家看不到别人的牌，状态空间巨大，变化多得要命，根本不是普通的AI能搞定的&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。像微软当年搞的那个Suphx，据说水平已经能跟顶尖专业选手掰手腕了，它还用了什么&lt;/span&gt;&lt;strong&gt;&lt;span&gt;卷积神经网络&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，专门训练了丢牌、立直、吃碰杠五种不同的决策模型，光是丢牌一个模型就得输出34个节点，用来算每一种出牌的概率&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。你就想想，这里面得算多少步概率，这玩意儿比人脑快多了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;不过话说回来，虽然技术在进步，但我们用的时候也得擦亮眼睛。我之前就在应用市场上看到一个叫&lt;/span&gt;&lt;strong&gt;&lt;span&gt;《磁场麻将AI》&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 的App，下载量还挺高。我打开一看，发现这东西好就好在它支持四川麻将和日本麻将两种玩法，最让我心动的是它的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;实时识别功能&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;——你用摄像头对着牌面一照，AI就能自动给你分析，而且因为是本地模型处理，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;不需要联网，也不用担心隐私泄露&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，这在现在的App里算是一股清流了&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我当时就在想，要是早几年有这个，我也不至于过年输了老妈的压岁钱啊。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;当然，市面上还有不少类似的工具，像什么&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Akagi雀魂智能助手&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，专门针对雀魂这款游戏搞的实时AI分析，通过概率模型帮你计算不同出牌的胜率差异，就像牌桌上给你开了个“战术沙盘”一样&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。还有&lt;/span&gt;&lt;strong&gt;&lt;span&gt;雀神拆搭秘籍&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，它内置了&lt;/span&gt;&lt;strong&gt;&lt;span&gt;十万道拆搭练习题&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，还能拍照识别手牌，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;1秒内算出最优解&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，告诉你该出哪张牌、有几门进张&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。有些麻将AI助手甚至还搞出了&lt;/span&gt;&lt;strong&gt;&lt;span&gt;AI眼镜版&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;——一位完全不会打麻将的博主，就靠一副自主研发的AI智能眼镜，靠着近乎&lt;/span&gt;&lt;strong&gt;&lt;span&gt;100%的牌面识别准确率&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，再加上语音识别模块实时采集各家出牌顺序，竟然能“一把胡到底”，搞得网友们都炸了锅&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;但我必须跟各位牌友提个醒——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;天上不会掉馅饼，用这些玩意儿的风险也不小&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。微信那边管得很严，2026年年初就专门发过公告，说要是发现有人用&lt;/span&gt;&lt;strong&gt;&lt;span&gt;外挂、辅助工具&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;这些乱七八糟的玩意儿，轻则限制功能，重则直接&lt;/span&gt;&lt;strong&gt;&lt;span&gt;下架封号&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我一个哥们之前就是在微信小程序里打麻将，手贱用了某个号称“百分百不封号”的辅助软件，结果第二天账号就被永久封禁了，他气得差点把手机摔了&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。这还不算完，你要是在线下麻将馆里偷偷用这些设备，一旦被人发现，轻则翻脸吵架，重则可能引发肢体冲突，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;搞不好还有人身危险&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。所以各位，咱还是老老实实把这玩意儿当成&lt;/span&gt;&lt;strong&gt;&lt;span&gt;学习工具&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;和&lt;/span&gt;&lt;strong&gt;&lt;span&gt;陪练教练&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;来用，别想着靠它去作弊赢钱，那真不值当。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;那说到怎么用才靠谱呢？我&lt;/span&gt;&lt;strong&gt;&lt;span&gt;亲自踩坑试了一圈&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;之后，总结了几条实用心得，分享给你：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;第一，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;挑工具要看是不是本地处理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。千万别用那种要把你手牌数据上传到云端的App，鬼知道后台谁在看你的牌。像&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Akagi这种开源工具&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;就挺好，所有数据都在你本地电脑上跑，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;平均决策时间不到0.3秒&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，安全又流畅&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。你要是对技术不太熟，它还有一键安装脚本，Windows和Mac都能用，大概&lt;/span&gt;&lt;strong&gt;&lt;span&gt;5分钟就能搭好&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;自己的AI教练&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;第二，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;把它当“陪练”而不是“外挂”&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 。你要真想提高牌技，就&lt;/span&gt;&lt;strong&gt;&lt;span&gt;多看看AI给出的决策理由&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，理解它为什么建议你出这张牌而不是那张。我之前用过一个叫&lt;/span&gt;&lt;strong&gt;&lt;span&gt;算伴&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;的App，里面有个“叫口推演训练”功能，能模拟真实对局场景，帮你练习判断对手听牌、减少点炮&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.59722px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;35&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。你一边打一边学，慢慢就能培养出自己的判断力。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;第三，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;别在微信小程序里搞事情&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。微信那边现在的检测越来越严格，一旦被系统判定为异常操作，别说赢钱了，账号都可能直接没了&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;strong&gt;&lt;span&gt;安全第一&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，咱玩麻将图的是开心，别搞得提心吊胆的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说到底，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;麻将AI助手这东西是把双刃剑&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;——用好了，它是你牌技进阶的好帮手；用歪了，它就是坑你没商量的“坑人货”。我自己现在的做法是：平时在家用这些工具做拆搭训练、听牌推演，打牌的时候偶尔参考一下AI的思路，但绝不依赖。毕竟打麻将最大的乐趣，还是在于和朋友边打边聊、你攻我守的那种&lt;/span&gt;&lt;strong&gt;&lt;span&gt;人情味儿和烟火气&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，你说是不是这个理儿？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说了这么多，我知道肯定还有不少牌友心里还有疑问。下面我就挑几个大家最关心的问题，好好聊一聊。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“成都李大爷”问：我是四川人，天天打血战到底，有没有专门针对川麻的AI工具？你上面说的那些支持川麻不？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 李大爷问得好，咱们四川人打麻将那可是出了名的讲究——血战到底、缺一门、刮风下雨，规矩多得很。说实话，市面上专门针对四川麻将血战到底的AI工具确实比日麻、雀魂少，但还是有几款不错的。我上面提到的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;《磁场麻将AI》&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ，它就明确支持四川麻将模式，用的是CNN目标检测技术，识别率挺高的，而且是本地处理不联网，不用担心隐私&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。还有一款叫&lt;/span&gt;&lt;strong&gt;&lt;span&gt;“算伴”&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 的App，我强烈推荐给你，它就是&lt;/span&gt;&lt;strong&gt;&lt;span&gt;专门为四川麻将/血战到底设计的&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。这里面有个“AI智能拆搭”功能，能实时帮你分析每张牌的价值，推荐最优拆搭方案，帮你提高听牌效率。还有一个“叫口推演训练”，能模拟真实对局场景，帮你练习判断对手听什么牌，减少点炮的概率&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.59722px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;35&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。李大爷你要是想系统提升川麻将技术，可以先试试“算伴”，反正有免费试用，用着合适再考虑会员，一周也就6块钱，比你输一把的钱少多了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“广东小陈”问：我平时主要玩雀魂，网上的Akagi这个AI助手到底怎么装？我是个电脑小白，怕搞不懂。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 小陈你好，这个问题问到点子上了。我跟你说实话，我之前看到Akagi要装Python环境、配证书啥的，也是一头雾水，差点就放弃了。但后来我硬着头皮试了一次，发现其实没想象中那么复杂。Akagi现在做得挺人性化的，它准备了&lt;/span&gt;&lt;strong&gt;&lt;span&gt;一键安装脚本&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;——Windows用户下载下来直接&lt;/span&gt;&lt;strong&gt;&lt;span&gt;双击run_akagi.bat&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，Mac用户双击run_akagi.command，系统会自动帮你完成环境配置和依赖安装，大概&lt;/span&gt;&lt;strong&gt;&lt;span&gt;5分钟就能搞定&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，技术小白也完全没问题&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。安装好之后，你需要做一步关键操作：在雀魂游戏里&lt;/span&gt;&lt;strong&gt;&lt;span&gt;配置一下代理设置&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，让助手能获取到游戏数据。Akagi启动后会显示在游戏界面右侧，实时给你出牌建议，它会告诉你不同打法的胜率差异，还会记录对手的打牌习惯&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。不过我提醒你一句，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;别在Steam平台用&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，风险相对高一些，建议你用网页版雀魂。还有就是合理使用，别全程自动操作，偶尔互动互动，保持自然一点，更安全&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。等你用了一段时间，把AI的思路学透了，到时候&lt;/span&gt;&lt;strong&gt;&lt;span&gt;关掉它你也能打得不错&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，那才是真正的收获。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“北京老刘”问：我就爱在微信小程序里打麻将，用麻将AI助手会被封号吗？那些卖“麻将软件挂”的靠谱不？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 老刘，这个问题我必须得认认真真跟你说，因为我亲眼见过太多人栽在这个上面了。微信那边对打麻将用辅助工具、外挂的打击力度越来越大，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;2026年1月刚发过一次专项治理公告&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，明确说了要对违规小程序、第三方外挂进行限制活动功能、限制分享能力，严重的直接&lt;/span&gt;&lt;strong&gt;&lt;span&gt;下架封号&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。你问那些卖的“麻将软件挂”靠不靠谱？我可以负责任地告诉你——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;大部分都是骗人的，而且风险极高&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。很多这类软件本身就带病毒，装到手机上可能把你的个人信息都盗走。就算真有“有效”的，微信的检测系统也不是吃素的，一旦被系统发现你出牌行为异常、频率不合逻辑，分分钟就会被封号&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我一个朋友就是不信邪，买了个号称“百分百不封号”的外挂，结果第三天账号就永久封禁了，里头还充了好几百块钱，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;哭都没地方哭&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。所以老刘，咱图个乐子就得了，别为了赢那几个钱把自己的号搭进去。真要练习，就用我之前说的那些正规的学习工具，在家自己练练拆搭、算牌，一样能提高。打麻将嘛，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;开心最重要，你说是不&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;？&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 13:15:03 +0800</pubDate></item><item><title>高考倒计时，AI志愿助手到底靠不靠谱？过来人讲点掏心窝子的大实话</title><link>http://www.sxkekun.com/a/7173.html</link><description>&lt;p&gt;&lt;span&gt;家人们，谁懂啊！眼看高考还剩两个月，我家那个神兽天天熬夜刷题，我这老母亲却在隔壁房间翻招生简章翻到怀疑人生。前天晚上翻着翻着突然血压飙升——你说这3000多所学校、上千个专业，到底哪个才是适合我家崽的？这就好比让你在火锅店点菜，菜单上有3000道菜，每道都写着“好吃不贵”，你选给我看看？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;然后我就在微信群里吐槽，有个老同学回了我一句：“你咋不用AI志愿助手在帮你筛筛？”我一愣，AI还能干这个？他甩给我一个链接，我点进去试了试，说实话第一反应是——真的挺香的！&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img.ddooo.com/uppic/210630/202106301143435729.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;别急，我慢慢跟你说我的真实体验，没准你家孩子也能用得上。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;事情是这样的，我儿子一模考了550分，按去年的线，报个一本勉强够，但选什么专业完全抓瞎。他自己想学计算机，我就想起前阵子新闻里说的教育部那个“智慧小招”AI助手&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。抱着试试看的心态点进去，直接跟它语音聊天，问“我家孩子550分能冲哪些计算机专业好的学校？”它秒回，不是那种糊弄人的套话，而是真的把历年录取数据、专业热度、甚至就业前景一股脑给你列出来&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。那一刻我忽然觉得，信息差这东西，AI是真的能帮你打破。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img1.mydrivers.com/img/20240606/3444abd9-a2db-494b-808d-4f1f41b9782f.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;那问题来了——有人肯定要问：AI推荐靠谱吗？它会不会是骗人的？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我跟你讲，我后来仔细研究了一下，AI志愿助手在数据这块确实有它的优势。它是基于近十年录取分数线、招生计划、院校专业组变化这些公开数据做匹配的，不是瞎猜的&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.53472px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;25&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。而且现在有些产品还接入了大模型，像百度那个接入了文心大模型和DeepSeek，支持自然语言对话，你问啥它答啥，不是那种死板的“请输入关键词”&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。最关键的是，它能给你按“冲、稳、保”三档推荐，把录取概率都算出来&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。就我这暴脾气，这比我自己翻那本厚得像砖头的大绿本省事太多了！&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;但我得给你泼盆冷水，这个AI志愿助手可不能当神仙供着。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;前阵子不是有个新闻嘛，张雪峰公开怼了一些AI填志愿的平台，说它们用的数据还是2020到2023年的老古董，根本没更新2025年教育部撤掉的37个专业名单&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.33941px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;27&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。这不是坑人吗？还有一个家长跟我吐槽，说她家孩子被系统推荐去读“人工智能加农业”这种专业，你听着不觉得邪门吗？这俩八竿子打不着的专业硬凑一块儿&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.33941px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;27&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。所以你看，AI再牛，它也只是个工具，不是算命先生。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我用下来的感受是啥呢？咱老话说得好——尽信书不如无书。AI志愿助手可以帮你快速缩小选择范围，把那些明显不靠谱的选项剔掉，但最后拍板还得你自己来。尤其是专业组填报这事儿，你得看清楚组里都有啥专业，别冲着“计算机”去，结果组里还绑了个“森林保护”&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 5.02691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;40&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。那万一你被调剂到森林保护去了，哭都没地儿哭。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说到这儿我得插一嘴，2026年的高考政策又有新变化。教育部要求高校原则上按专业招生，严控大类招生的数量和规模&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。啥意思呢？以前那种“先进校再分专业”的路子走不通了，你报志愿的时候就得想好要学啥专业。这不是逼着家长和孩子早点做规划嘛！所以提前用AI志愿助手在专业选择上做功课，真的挺有必要。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;好了，说了这么多，估计你们也有不少问题想问。别急，下面这几个问题都是我在各个家长群里看到的，我统一回答一下，希望能帮到你们。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;img src=&quot;https://img1.baidu.com/it/u=1365585494,1383517634&amp;fm=253&amp;app=53&amp;size=w438&amp;n=0&amp;g=0n&amp;f=jpeg&amp;fmt=auto?sec=1781233742&amp;t=66cfd4219d0bdb9ae9da4c2edf08b559&quot;&gt;&lt;/p&gt;&lt;strong&gt;&lt;span&gt;网友@风吹草低见牛羊问：AI志愿助手真的比花好几万找专家咨询管用吗？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说实话，这个问题我纠结了好久。我自己没舍得花好几万找专家，但我有个闺蜜花了18999找过张雪峰团队。她跟我说，专家除了帮你分析数据，更重要的是给情绪价值——家长焦虑的时候，有个人拍着胸脯说“你放心，肯定能录上”，那个心理安慰是AI给不了的&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.53472px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;25&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;但你也别以为AI就差了。AI志愿助手在数据整合和效率上绝对是碾压级的，几秒钟就能把几百所学校筛一遍，给你列出“冲稳保”清单，这要自己翻书得翻到猴年马月&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.53472px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;25&lt;/span&gt;&lt;/span&gt;&lt;span&gt;？而且它是免费的（部分功能付费），不用割肉。我的建议是：先用AI志愿助手做初筛，锁定20-30个目标院校和专业，然后找专家做个针对性答疑，这样既省钱又不踩坑。说白了，AI负责“广撒网”，专家负责“重点捞鱼”。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;img src=&quot;&quot;&gt;&lt;/p&gt;&lt;strong&gt;&lt;span&gt;网友@理科生他爹问：新高考“院校专业组”到底咋填？孩子570分能冲哪些学校？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;老哥，你这个问题问到点子上了。新高考的“院校专业组”其实就是把高校的专业按照选科要求分成一堆组，你报志愿的时候填的是“XX大学+XX专业组”，不是直接填学校&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 5.02691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;40&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我给你讲个坑：同一所大学不同专业组，录取分可能差好几十分！比如某985的冷门组520分就能上，热门组可能得620。所以你用AI志愿助手查的时候，一定要按“专业组”查，别只看学校整体分数线。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;570分能冲啥？我给你个方法：先查本省的一分一段表，找到570分对应的省排名。然后用AI志愿助手输入你的排名，它会自动匹配往年录取位次接近的学校和专业组&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.91753px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;43&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。记住口诀：冲的放在前面（1-2所，比自己排名高10%左右的）、稳的放中间（3-4所，和自己排名差不多）、保的放后面（1-2所，比自己排名低15%-20%）。别全冲啊，那是赌命，滑档了连哭都没地儿！&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;img src=&quot;&quot;&gt;&lt;/p&gt;&lt;strong&gt;&lt;span&gt;网友@不想让孩子学文科问：现在哪些专业就业前景好？我娃想学文科是不是没出路了？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;大姐，你这话可别当着娃的面说啊，伤自尊。文科咋就没出路了？2026年热门专业榜确实是以工科为主——电气工程及其自动化登顶，机械、自动化、车辆工程集体回暖，医学类全线飘红&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.93316px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;49&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。但文科也有香的啊！我给你列几个：法学（考公香饽饽）、金融（虽然卷但天花板高）、师范（稳定），还有这两年新冒出来的“数字媒体技术”“网络与新媒体”，就业路子宽着呢。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;再说一个特别重要的信息：2026年政策要求高校进一步优化专业组设置，把关联度高的专业放在一起，避免“冷热捆绑”&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。啥意思？就是说你报志愿的时候，被调剂到八竿子打不着的专业概率变小了。这对文科生反而是好事啊！所以别急着否定文科，关键是你娃自己喜欢什么。我当初就是逼着儿子学理科，结果他数学考了70多分，后悔死了。选专业这玩意儿，兴趣和天赋比啥都重要，咱当家长的别好心办坏事。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 11:09:02 +0800</pubDate></item><item><title>震惊！一场“AI碰一碰代理会议”让我彻底看懂了2026年的赚钱风口，实体店老板都坐不住了</title><link>http://www.sxkekun.com/a/7172.html</link><description>&lt;p&gt;&lt;span&gt;我嘞个乖乖，前段时间参加了一场会议，回来之后整个人跟打了鸡血似的，连着好几天都睡不着觉。你猜怎么着？就是那个“AI碰一碰代理会议”，说白了就是一堆搞本地生活、搞AI营销的同行凑一块儿，聊聊怎么帮实体店老板解决“客从哪儿来”这个老大难问题。不吹不黑，这场会开完，我是真看明白了——2026年想搞钱，路子在哪儿。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说实话，这年头谁开店谁知道，开门容易守店难。隔壁老王开的那家烧烤店，味道嘛也就那样，结果天天排长队，我楼下那家火锅店味道正宗得不行，食材也是一等一的新鲜，可就是没人来。这事儿你说气不气人？没办法，现在的年轻人吃个饭，先掏手机看评分、刷抖音、翻小红书，你店再好，线上没人知道，就等于白瞎。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://k.sinaimg.cn/n/sinakd20120/700/w900h600/20240808/e090-9e5dc6b2c0ac8602882608f95cde6ee2.jpg/w700d1q75cms.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这不，那场“AI碰一碰代理会议”上，就有人把这个痛点直接给捅破了——90%的实体店老板根本不懂怎么做线上营销，但他们100%需要有人帮他们做&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.47396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我当时听完就觉得，这不就是机会吗？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;啥是AI碰一碰？别整那些虚的，说白了就是一个让顾客“碰一下就帮你发朋友圈、发抖音、发小红书”的神器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://n.sinaimg.cn/sinakd2021525s/200/w1080h720/20210525/1250-kqpyffz3343859.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;可能有老铁还不清楚，我这儿跟你唠唠。AI碰一碰这个东西，本质上就是把NFC芯片塞进一张台卡或者桌贴里，顾客拿手机往上一碰，系统就自动把店里拍好的视频、图片、文案，甚至是大V的点评，一键发布到顾客自己的抖音、小红书、快手、大众点评上&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。整个过程大概就三五秒钟，顾客连脑子都不用动，就帮老板把宣传给做了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你可能会问，顾客凭啥要帮你发？问得好。其实很简单，碰一下能领红包、能抽奖、能拿优惠券，顾客自己也有好处，这叫双赢&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.76302px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;24&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。而且那些视频和文案都是AI生成的，不是那种硬邦邦的广告味儿，看着就跟真人打卡似的，平台也不会给你限流。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;会议上有人举了个例子，淮安有家重庆老火锅店，开了两三年，味道没得说，食材也新鲜，但店铺位置偏僻，每天进店就60来号人，月营业额10万出头，刨去房租人工成本，剩不了几个钱&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。老板愁得头发一把一把掉。后来找了个代理商帮忙铺了碰一碰卡，结果呢？不到一个月，顾客碰出来的视频总曝光量干到了30万，店里的人气肉眼可见地涨上来了，老板直接一口气下单了几十张桌贴，每张桌子都贴上&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。就问你服不服？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;代理到底咋赚钱？这玩意儿还真不像是那些坑人的割韭菜项目&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;聊到代理，那场会议上可热闹了，各种模式翻来覆去地分析。我听完总结了一下，大概就这么几层：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;头一层，叫服务商模式。说白了就是你出去跑商家，把产品卖给他们，拿销售差价。一台设备加一年的服务套餐，商家付你几千到上万块，你拿走利润大头。不需要交什么天价的加盟费，也不用囤货，轻装上阵&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.61458px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;22&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。这层的好处是上手快，嘴巴好使、腿勤快点的人都能干。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;第二层，运营商模式。这就更高级了，不光自己能卖产品，还能发展下线代理商，坐享团队提成。有点像那些年搞微商的顶层代理，但区别在于这玩意儿真有实物、真有效果，不是那种空手套白狼的把戏&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.61458px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;22&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;第三层，也是最香的一层，叫管道收益。你卖出去的产品，商家后续用着得充值算力来生成AI内容，这笔流水里你躺着拿30%的分成&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.61458px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;22&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。等于说你今天拓了一个客户，往后只要他在用，你就一直有钱进账，跟收房租似的，每月到点就有。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说实话，会上有个老哥说了一段话把我给整破防了——“传统代理商光靠赚差价，利润透明得跟玻璃似的，连底裤都被看穿了。但碰一碰代理的本质不是卖硬件，是帮商家解决获客难的问题。商家不缺买设备的钱，缺的是不会搞流量。你帮他把流量搞起来，他心甘情愿给你交服务费。”&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.47396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;这话说得太在理了，一下就戳中了核心。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;实体店老板有多苦？说出来你可能不信，但数据不会骗人&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;那场会议结束后，我还特意跟几个做实体店的朋友聊了聊。不问不知道，一问吓一跳。现在超过80%的中小实体店，线上客流基本就指着一两个平台过日子，美团、大众点评的佣金抽成动不动就20%以上，老板累死累活赚点钱，大半都交给平台了&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.6849px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;23&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你说不做平台吧，那更完蛋，直接没流量。做吧，钱哗哗往外流。更惨的是，想做抖音小红书，自己又不会拍不会剪，请个代运营公司一个月好几万，效果还不一定有保证&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.6849px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;23&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。所以很多老板就卡在这个不上不下的位置，进退两难。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;AI碰一碰这玩意儿好就好在，它把这堵墙给打破了。顾客一碰，AI自动生成高质量内容，还能同时发到七八个平台，老板不用花一分钱推广费，就让顾客成了行走的广告牌。你想想，一个店一天进来100个顾客，有30个人愿意碰一下发个视频，这一天就是30条宣传内容在全网传播，日积月累，那个曝光量有多恐怖？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;别急着冲，先把路看明白——靠谱的系统和坑爹的项目怎么区分？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;会上有人私下找我唠嗑，说市面上那些碰一碰的项目鱼龙混杂，有些就是纯割韭菜，让你交一笔钱然后扔给你一堆没用的卡片，啥效果都没有。我听完也是直拍大腿，确实，这种事儿太多了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我跟你掏心窝子说几句。真正靠谱的AI碰一碰系统，起码得具备几个硬指标：一是AI内容生成能力要强，不能生成一堆狗屁不通的文案；二是NFC感应要灵敏，不能碰了没反应；三是支持的平台要多，抖音、小红书、快手、大众点评都得能覆盖&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 5.03646px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;40&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;还有就是看收益模式，那种让你先交几万块加盟费的，基本可以绕道走了。正规的项目，代理费或者物料成本都控制在几千块以内，后续靠服务费和分润赚钱，而不是靠收代理费赚钱&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.48958px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;18&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。这一点你一定要擦亮眼睛，别被那些花里胡哨的宣传给忽悠了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;写在也是我想对所有还在犹豫的人说的&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说句实在话，AI碰一碰这个东西，本身技术门槛不高，但它切中的是实体店最疼的那个点——获客难。而且这个痛点不是少数人的，是数以千万计的线下门店每天都在面对的。只要你肯跑、肯干、肯动脑子，这个赛道的机会是真实存在的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我参加完那场“AI碰一碰代理会议”回来，立马就开始研究周边的商家资源了。不瞒你说，已经谈下了两家火锅店，正准备签约呢。路是自己走出来的，机会是等不来的。你要是也在找项目，不妨花点时间去了解了解这个方向，说不定下一个开单的就是你。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;以下内容来源于不同网友针对本文提出的问题与我的回答&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“山东老王创业记”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我手头没啥钱，就两三万块启动资金，能干碰一碰代理吗？会不会交完钱就发现是骗子？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 老王啊，你这个顾虑我太懂了。当初我自个儿也是这么想的，手里就那么点家当，生怕一脚踩空掉坑里。我跟你说个实在的，真正的AI碰一碰代理，压根不需要你交什么天价的加盟费或者代理费，那都是老套路了。正规的项目，你只需要花钱的地方就是采购展业物料——比如台卡、桌贴、宣传海报这些，几百到几千块就能搞定&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.48958px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;18&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。剩下的就是靠你的腿和嘴去跑商家、谈合作。当然，我也得提醒你一句，现在市面上确实有些打着“碰一碰”旗号招摇撞骗的，上来就要你交三五万代理费，这种你直接扭头就走，别犹豫。怎么分辨呢？你就问对方两个问题：一是有没有真实的使用案例，比如哪家火锅店、哪家美容院用过，效果咋样；二是AI内容生成能不能现场演示，生成出来的东西能不能看。如果这两条都过不了关，那十有八九就是坑。所以老王，钱多钱少不是最关键的，关键是别把钱扔错地方。先找两三家靠谱的平台对比一下，看看他们的政策、看看他们的系统演示，心里有底了再下手。两万块的启动资金，在这个赛道上绝对够用了，别怕。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“不想上班的小李”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 哥，我看你说做代理很简单，可我嘴巴笨不会谈客户，那岂不是干不了这行？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 小李啊，你这可就冤枉我了，我可没说做代理很简单。恰恰相反，这行最考验人的不是嘴巴会不会说，而是腿够不够勤、脸皮够不够厚。嘴巴笨这事儿其实有办法解决，现在很多平台都给代理商配了现成的话术本和谈单工具，你照着念都行&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.76302px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;24&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。真正难的是什么呢？是你愿不愿意一家一家地走进那些实体店里，跟老板面对面坐下来，认认真真地听他倒苦水、聊他的难处。很多实体店老板，其实内心特别孤独，天天守着一个店，没人说话，也没人真正理解他们为什么生意做不起来。你去到店里，不是去推销东西的，而是去当他的“营销顾问”——帮他分析问题、给他出主意、教他怎么做线上。你的价值不是卖给他一张卡片，而是给他提供一个能解决问题的方案。我认识的做得好的代理商，没有一个是最能说的那个，但一定是最愿意花时间去了解商家需求的那个。小李，如果你觉得自己嘴巴笨，那就多用耳朵听，多问“老板您觉得现在最大的问题是什么”，多点头表示理解，然后把方案讲清楚说明白，把效果展示给他看。久而久之，口碑就传出去了，人家主动来找你。别急着否定自己，先跑一百家店试试，你会有惊喜的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“全职妈妈小月”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我每天要带孩子做家务，时间特别碎，能干这个代理吗？能不能纯线上操作不跑线下？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 小月姐，这个问题问到点子上了。我跟你说，这行最适合的就是你这种时间零散但特别想干点事儿的人。为什么呢？因为它不要求你朝九晚五坐班，也不需要你整天泡在外面跑。很多代理商本身就是兼职干着的，有的白天上班晚上跑商家，有的周末去商业街转转，一个月也能谈下来十几二十个客户&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.47396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。至于纯线上操作这个问题，我得实话实说：很难，基本不现实。因为AI碰一碰这个业务的核心是“线下面销”，你得让商家看到设备、看到演示、看到效果，他才愿意掏钱。不过你也不用太担心，现在很多平台都有远程演示和线上签约的支持工具，你前期可以用手机录个演示视频发给商家看，有初步意向了再约个时间当面确认一下，这样效率就高多了&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.76302px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;24&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。小月姐，我建议你从自己家附近的小区商圈开始，送完孩子、买完菜顺路进几家店坐坐，跟老板唠十分钟就走，不耽误正事儿。一天两三通下来，一个月就是六七十个接触量，转化率哪怕只有5%，也够你赚一笔不菲的零花钱了。而且你这身份有个天然优势——同为宝妈，你更懂那些带娃进店的妈妈们需要什么，跟餐饮店、亲子乐园这些商家的沟通反而更有共鸣。试试呗，说不定就打开新世界的大门了。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 08:51:01 +0800</pubDate></item><item><title>面向切面编程（AOP）从入门到原理剖析：告别重复代码与耦合噩梦</title><link>http://www.sxkekun.com/a/7171.html</link><description>&lt;p&gt;&lt;strong&gt;&lt;span&gt;课堂ai助手 | 2026年4月9日 14:30 发布于北京&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;摘要&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：在Spring Boot 4.0适配JDK 26的背景下，AOP作为Spring框架的两大核心技术之一，依旧是面试必考与项目优化的核心技能。本文从传统OOP痛点切入，深入讲解切面（Aspect）、连接点（Join Point）、通知（Advice）、切点（Pointcut）等核心概念，结合可运行代码示例剖析JDK动态代理与CGLIB两种底层实现机制，并提供高频面试题及标准答案，帮助技术学习者建立从概念到原理的完整知识链路。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img.ddooo.com/uppic/211110/202111101001119451.jpg&quot;&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;引言&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;在2026年的Java技术栈中，Spring框架仍然是企业级应用开发的核心选择。而&lt;/span&gt;&lt;strong&gt;&lt;span&gt;面向切面编程（Aspect-Oriented Programming，AOP）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ，作为Spring两大核心技术之一，其重要性与日俱增。根据2025年Java生态统计，78%的企业级应用使用AOP解决横切关注点问题&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.47396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img.ddooo.com/uppic/211110/202111101008577449.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;许多开发者在实际开发中只会使用AOP，却说不出其底层原理；分不清连接点（Join Point）和切点（Pointcut）的区别；面试时面对“JDK动态代理与CGLIB有何不同”这类问题，回答支离破碎；遇到&lt;/span&gt;&lt;code&gt;@Transactional&lt;/code&gt;&lt;span&gt;失效的情况，更是无从排查。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;本文将从开发者最真实的痛点出发，由浅入深讲解AOP的核心概念、底层实现原理，并附上完整代码示例与高频面试题，帮助你建立完整的知识链路。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;一、痛点切入：传统OOP开发中的“重复劳动”&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;先来看一段最常见的业务代码。假设我们要为多个业务方法添加日志记录和事务管理功能：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; username&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; password&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 日志记录——重复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【日志】开始执行register方法，参数：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 事务开启——重复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【事务】开启事务&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 核心业务逻辑&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;执行用户注册，用户名：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; username&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 事务提交——重复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【事务】提交事务&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 日志记录——重复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【日志】register方法执行完成&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Exception&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 事务回滚——重复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【事务】回滚事务&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 日志记录异常——重复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【日志】register方法执行异常：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;updateProfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; userId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; nickname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 同样的日志、事务代码重复出现...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;传统OOP面临的三大问题&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;代码冗余严重&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：日志记录、事务管理、权限校验等通用功能需要分散到每个业务方法中，代码重复率可达60%以上&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.47396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;耦合度极高&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：业务逻辑与横切逻辑（日志、事务等）紧密耦合，业务方法“被迫”承载了不属于它的职责&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;维护困难&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：修改通用逻辑（如更换日志框架），需要逐一修改所有业务方法，极易遗漏且成本高昂。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;AOP的出现正是为了解决上述痛点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：将横切关注点（Cross-cutting Concerns）从业务逻辑中剥离，实现代码复用与松耦合&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。其核心思想是——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;在不修改源代码的前提下，为程序主干功能添加增强逻辑&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;二、核心概念：AOP的五个关键词&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;理解AOP，必须先搞清楚以下五个核心概念。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;1. 连接点（Join Point）&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：程序执行过程中可以插入切面增强逻辑的关键位置&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;通俗来说，连接点就像高速公路上“允许设置服务区”的各个出口。在Spring AOP中，连接点特指&lt;/span&gt;&lt;strong&gt;&lt;span&gt;方法执行&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;这一级别&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.79427px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;20&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;2. 切点（Pointcut）&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：通过表达式精确匹配一组连接点的规则，定义“哪些方法需要被增强”&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;如果把所有方法都看作连接点，那么切点就像在问：“哪些方法需要增强？”切点表达式示例：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Pointcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;execution( com.example.service..(..))&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;serviceLayer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 匹配service包下所有类的所有方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Pointcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@annotation(com.example.Log)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;logAnnotation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 匹配被@Log注解标记的方法&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;3. 通知（Advice）&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：在切点处执行的增强逻辑，描述“增强什么、在什么时候增强”&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring AOP提供了五种通知类型：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:276px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;通知类型&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;注解&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;执行时机&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;前置通知&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;@Before&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;目标方法执行前&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;后置通知&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;@After&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;目标方法执行后（无论是否异常）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;返回通知&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;@AfterReturning&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;目标方法正常返回后&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;异常通知&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;@AfterThrowing&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;目标方法抛出异常后&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;环绕通知&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;@Around&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;完全控制方法执行，可决定是否执行原方法&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;4. 切面（Aspect）&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：将切点和通知组合在一起的模块化单元，封装了一个完整的横切关注点&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.79427px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;20&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;5. 织入（Weaving）&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：将切面应用到目标对象，创建代理对象的过程&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。Spring AOP采用&lt;/span&gt;&lt;strong&gt;&lt;span&gt;运行时动态织入&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;的方式，即在程序运行时通过代理对象完成增强逻辑的插入。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;三、概念关系：一句话串联所有术语&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;上述五个概念之间存在着清晰的逻辑层级：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;切面（Aspect）= 切点（Pointcut）+ 通知（Advice）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;切点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;回答了“&lt;/span&gt;&lt;strong&gt;&lt;span&gt;哪里&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;”的问题&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;通知&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;回答了“&lt;/span&gt;&lt;strong&gt;&lt;span&gt;什么&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;”和“&lt;/span&gt;&lt;strong&gt;&lt;span&gt;何时&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;”的问题&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;织入&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;是将切面应用到目标对象的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;过程&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;连接点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;是程序执行过程中&lt;/span&gt;&lt;strong&gt;&lt;span&gt;可能&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;被拦截的点&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;切点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;则是从连接点中筛选出“&lt;/span&gt;&lt;strong&gt;&lt;span&gt;实际&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;”被拦截的点&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;一句话记忆：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;切面通过切点筛选连接点，在织入时按通知类型执行增强&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;四、代码实战：从零实现一个AOP示例&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;我们通过一个完整的权限校验案例，直观感受AOP的效果。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;场景：为Service层方法添加权限校验功能&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;步骤一：定义自定义注解&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;annotation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Target&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ElementType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;METHOD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Retention&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;RetentionPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RUNTIME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token annotation punctuation&quot;&gt;@interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RequirePermission&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 需要的权限标识&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;步骤二：目标业务类&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;springframework&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stereotype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Service&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Service&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@RequirePermission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ORDER_CREATE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createOrder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; productId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;执行创建订单业务逻辑&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@RequirePermission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ORDER_VIEW&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getOrderDetail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Long&lt;/span&gt; orderId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;执行查询订单详情业务逻辑&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;订单详情&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 普通方法，无权限校验&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;testMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;这是一个不需要权限校验的方法&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;步骤三：编写AOP切面类&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;aspectj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ProceedingJoinPoint&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;aspectj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;annotation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;org&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;springframework&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stereotype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Component&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Aspect&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;// 标记为切面类&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@Component&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;// 交由Spring容器管理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PermissionAspect&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 定义切点：匹配所有被@RequirePermission注解标记的方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Pointcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@annotation(requirePermission)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;permissionPointcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;RequirePermission&lt;/span&gt; requirePermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 环绕通知：实现权限校验逻辑&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token annotation punctuation&quot;&gt;@Around&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;permissionPointcut(requirePermission)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;checkPermission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;ProceedingJoinPoint&lt;/span&gt; joinPoint&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;/span&gt;
&lt;span&gt;                                   &lt;span class=&quot;token class-name&quot;&gt;RequirePermission&lt;/span&gt; requirePermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; requiredPermission &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requirePermission&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【权限校验】需要权限：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; requiredPermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 模拟获取当前用户的权限列表&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt; currentUserPermission &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ORDER_CREATE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentUserPermission&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requiredPermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【权限校验】校验通过，执行目标方法&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 执行目标方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; joinPoint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;proceed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【权限校验】目标方法执行完成&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【权限校验】校验失败，无权执行该方法&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SecurityException&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;权限不足，需要：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; requiredPermission&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;步骤四：使用Spring Boot启动验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@SpringBootApplication&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token annotation punctuation&quot;&gt;@EnableAspectJAutoProxy&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 启用AOP代理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Application&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;ConfigurableApplicationContext&lt;/span&gt; context &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;SpringApplication&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Application&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt; orderService &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;OrderService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 调用需要权限校验的方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        orderService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createOrder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;P10001&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 调用不需要权限校验的方法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        orderService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;testMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;执行效果&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;createOrder()&lt;/code&gt;&lt;span&gt;方法执行前自动进行了权限校验&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;testMethod()&lt;/code&gt;&lt;span&gt;方法正常执行，无任何额外增强&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;业务代码&lt;/span&gt;&lt;code&gt;OrderService&lt;/code&gt;&lt;span&gt;与权限校验逻辑完全解耦&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;这就是AOP的魔力——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;业务方法只需关注自己的核心逻辑，增强功能完全由切面统一管理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;五、底层原理：AOP背后站着动态代理&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;理解了AOP“能做什么”，接下来深入“怎么做到的”。&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Spring AOP的实现本质上依赖于代理模式（Proxy Pattern）这一经典设计模式&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.70052px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;29&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;代理模式的核心价值在于：通过引入代理对象作为目标对象的中间层，在不修改目标对象代码的前提下，实现对目标对象访问的控制与增强&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.70052px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;29&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;1. JDK动态代理：基于接口的实现&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;工作原理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK动态代理要求目标对象必须实现至少一个接口，通过&lt;/span&gt;&lt;code&gt;java.lang.reflect.Proxy&lt;/code&gt;&lt;span&gt;类和&lt;/span&gt;&lt;code&gt;InvocationHandler&lt;/code&gt;&lt;span&gt;接口，在运行时动态生成一个实现了相同接口的代理对象&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;JDK动态代理的核心代码（极简版）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; ：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token import&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reflect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;JdkAopDemo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 目标接口&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 目标实现类&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceImpl&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;执行注册业务逻辑&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;UserServiceImpl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 创建JDK动态代理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt; proxy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;UserService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Proxy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newProxyInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClassLoader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getInterfaces&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;InvocationHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                &lt;span class=&quot;token annotation punctuation&quot;&gt;@Override&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; proxy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Method&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;/span&gt;
&lt;span&gt;                    &lt;span class=&quot;token keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                    &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【代理前置增强】方法执行前&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                    &lt;span class=&quot;token class-name&quot;&gt;Object&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; method&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;invoke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                    &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;【代理后置增强】方法执行后&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        proxy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;输出&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;text&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;【代理前置增强】方法执行前&lt;/span&gt;
&lt;span&gt;执行注册业务逻辑&lt;/span&gt;
&lt;span&gt;【代理后置增强】方法执行后&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;&lt;span&gt;2. CGLIB动态代理：基于继承的实现&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;工作原理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：对于没有实现接口的类，Spring AOP会使用CGLIB库生成代理对象。CGLIB底层采用ASM字节码生成框架，直接对目标类的字节码进行操作，生成该类的子类，并重写所有可重写的方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;3. Spring如何选择代理方式？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;Spring通过&lt;/span&gt;&lt;code&gt;DefaultAopProxyFactory&lt;/code&gt;&lt;span&gt;自动判断代理方式&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;text&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;如果目标类实现了接口 且 未强制使用CGLIB → 使用 JDK 动态代理&lt;/span&gt;
&lt;span&gt;否则 → 使用 CGLIB 动态代理&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:322px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;对比维度&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;JDK动态代理&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;CGLIB动态代理&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;实现原理&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;基于接口，反射调用&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;基于继承，字节码生成&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;目标类要求&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;必须实现至少一个接口&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;无需实现接口，但不能是final类&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;代理对象类型&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;实现了相同接口&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;目标类的子类&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;final方法&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;不支持（接口方法无final）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;无法代理（不能重写）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;性能&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较高（反射调用）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;略低（字节码生成开销）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;Spring默认策略&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;有接口时优先&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;无接口时自动切换&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;h2&gt;&lt;span&gt;六、底层技术支撑&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;JDK动态代理依赖&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;反射机制&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;code&gt;Method.invoke()&lt;/code&gt;&lt;span&gt;在运行时动态调用目标方法&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;代理类字节码动态生成&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;code&gt;Proxy&lt;/code&gt;&lt;span&gt;类在运行时创建代理类的字节码&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;CGLIB动态代理依赖&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;ASM字节码框架&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：直接操作Java字节码，在运行时生成子类&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;方法拦截器链&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：通过&lt;/span&gt;&lt;code&gt;MethodInterceptor&lt;/code&gt;&lt;span&gt;接口实现方法调用的拦截与分发&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;这两个底层知识点是理解AOP实现的关键。&lt;/span&gt;&lt;strong&gt;&lt;span&gt;正是反射和字节码技术的成熟，才让运行时代理成为可能&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。建议读者在掌握本文内容后，进一步深入学习反射机制与ASM框架，那将是理解Spring底层源码的钥匙。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;七、高频面试题与参考答案&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;面试题1：什么是AOP？Spring AOP的实现原理是什么？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;标准答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;AOP（Aspect-Oriented Programming，面向切面编程）是一种编程范式，通过将横切关注点（如日志、事务、权限）从业务逻辑中分离，实现在不修改源代码的前提下为方法添加增强逻辑&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.85677px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;42&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring AOP的实现依赖于&lt;/span&gt;&lt;strong&gt;&lt;span&gt;动态代理机制&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。当目标类实现了接口时，Spring使用&lt;/span&gt;&lt;strong&gt;&lt;span&gt;JDK动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;生成实现相同接口的代理对象；当目标类未实现接口或配置强制使用CGLIB时，Spring使用&lt;/span&gt;&lt;strong&gt;&lt;span&gt;CGLIB动态代理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;通过继承方式生成代理对象。Spring容器最终注入的是代理对象而非原始对象，从而实现对目标方法的拦截与增强&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.85677px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;42&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;踩分点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：概念定义 + 两种代理方式 + 代理对象的注入&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题2：JDK动态代理和CGLIB有什么区别？各自有什么限制？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;标准答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;两者都是动态代理的实现方式，主要区别如下：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;实现原理不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK基于接口，通过反射调用；CGLIB基于继承，通过字节码生成子类。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;目标类要求不同&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK要求目标类必须实现至少一个接口；CGLIB无此要求，但不能代理final类和final方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.85677px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;42&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;性能表现&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JDK在方法调用时性能较好；CGLIB在代理创建时开销较大。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;Spring选择策略&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：默认优先使用JDK，无接口时自动切换至CGLIB。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;踩分点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：原理差异 + 适用场景 + 限制条件&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题3：Spring AOP的切点表达式有哪些常见写法？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;标准答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring AOP最常用的是&lt;/span&gt;&lt;code&gt;execution&lt;/code&gt;&lt;span&gt;表达式，基本语法为：&lt;/span&gt;&lt;code&gt;execution([修饰符] 返回类型 [包名].[类名].[方法名](参数))&lt;/code&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.79427px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;20&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;常用示例：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;execution( com.example.service..(..))&lt;/code&gt;&lt;span&gt;：匹配service包下所有类的所有方法&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;@annotation(com.example.Log)&lt;/code&gt;&lt;span&gt;：匹配被@Log注解标记的方法&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;within(com.example.service.UserService)&lt;/code&gt;&lt;span&gt;：匹配UserService类中的所有方法&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;args(java.lang.String)&lt;/code&gt;&lt;span&gt;：匹配参数类型为String的方法&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;踩分点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：语法结构 + 至少三个实际表达式&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题4：为什么@Transactional事务有时会失效？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;标准答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@Transactional&lt;/code&gt;&lt;span&gt;失效的常见原因主要有以下几种：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;方法不是public&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：Spring事务只作用于public方法&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.85677px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;42&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;同类内部调用&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：在同一个类中，A方法调用B方法时，调用的是原始对象而非代理对象，导致AOP不生效。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;final方法&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：CGLIB代理无法重写final方法。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;异常未被声明&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：事务默认只在RuntimeException和Error时回滚。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;类未被Spring管理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：直接new的对象无法应用AOP。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;踩分点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：列举至少3个常见原因，重点强调内部调用问题&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;面试题5：Spring AOP和AspectJ有什么区别？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;标准答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Spring AOP和AspectJ都是面向切面编程的框架，主要区别在于&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.79427px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;20&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:230px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;维度&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;Spring AOP&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;AspectJ&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;织入时机&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;运行时动态代理&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;编译时/类加载时&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;连接点范围&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;仅方法级别&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;字段、构造器、静态代码块等&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;性能&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;运行时开销&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;编译时优化，性能更高&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;使用场景&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;轻量级应用&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;复杂切面需求&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;踩分点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：织入时机差异 + 功能范围差异 + 性能对比&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;八、总结与进阶预告&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;核心知识回顾&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:376px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;知识点&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;一句话总结&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;AOP的本质&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;在不修改源码的前提下，通过代理为方法添加增强逻辑&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;五大核心概念&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;切面 = 切点 + 通知，织入是过程，连接点是候选，切点是实际&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;JDK vs CGLIB&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;接口用JDK，无接口用CGLIB；final方法和同类内调用是AOP失效的两大陷阱&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;五种通知类型&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;@Before、@After、@AfterReturning、@AfterThrowing、@Around&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;底层依赖&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;反射机制 + ASM字节码框架&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;常见误区提醒&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;❌ 认为&lt;/span&gt;&lt;code&gt;@Transactional&lt;/code&gt;&lt;span&gt;在private方法上也生效 → &lt;/span&gt;&lt;strong&gt;&lt;span&gt;不会，AOP只拦截public方法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;❌ 认为切点和连接点是同一个概念 → &lt;/span&gt;&lt;strong&gt;&lt;span&gt;切点是筛选规则，连接点是可被拦截的位置&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;❌ 认为Spring AOP支持字段级别的拦截 → &lt;/span&gt;&lt;strong&gt;&lt;span&gt;仅支持方法级别&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;❌ 认为CGLIB总能代理任何类 → &lt;/span&gt;&lt;strong&gt;&lt;span&gt;final类无法被继承，final方法无法被重写&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span&gt;进阶内容预告&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;下一篇我们将深入探讨&lt;/span&gt;&lt;strong&gt;&lt;span&gt;Spring AOP的源码级解析&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，包括：&lt;/span&gt;&lt;code&gt;BeanPostProcessor&lt;/code&gt;&lt;span&gt;如何介入Bean生命周期创建代理、&lt;/span&gt;&lt;code&gt;DefaultAopProxyFactory&lt;/code&gt;&lt;span&gt;的代理选择源码实现、以及&lt;/span&gt;&lt;code&gt;ReflectiveMethodInvocation&lt;/code&gt;&lt;span&gt;中责任链模式的通知执行链路。敬请期待！&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考资料&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;Spring Framework 6.2 / Spring Boot 4.0 官方文档&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;Oracle JDK 27 / JDK 26 技术说明&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Wed, 13 May 2026 07:39:02 +0800</pubDate></item><item><title>陕西家长注意！别再乱花冤枉钱，找对陕西AI作业机代理商才是真省心</title><link>http://www.sxkekun.com/a/7170.html</link><description>&lt;p&gt;&lt;span&gt;说实话，当妈这几年，我自认为心理素质还行，直到上个礼拜，我差点把家里那台花四千多块买的AI学习机给砸了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;事情是这样的，上周五晚上，我闺女拿着一张数学卷子找我签字，我扫了一眼，好家伙，最后一道应用题打了个红叉叉。我问她咋回事，她一脸委屈：“妈妈，那个AI老师说我的步骤错了，可我觉得没错啊。”我拿过卷子仔细瞅了瞅，又用机器重新扫了一遍——结果你猜咋着？机器直接把孩子写的“7”识别成了“9”，整道题从根上就偏了！我闺女说，这已经不是第一次了，有时候作文写得好好的，AI给出的评语永远是“结构完整、语言流畅”那几句车轱辘话，跟没评一样。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic.globalimporter.net/upload9/2014-12-30/9513961430145035.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我当时那个火啊，蹭就上来了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这四千多块，买的是个啥？买的是个“电子祖宗”回来供着吗？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://upload.gongkong.com/Upload/gongkong/baiduEditorImage/202005/11/c57b071ce84f4287ab47b18a5461010f_w.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;其实不光是我们家，我后来在家长群里一打听，好家伙，踩坑的比比皆是。有个在西安高新区的妈妈更绝，她说她家孩子，一个六年级的娃，硬生生被学习机“逼”着刷了俩月的四年级基础题。机器显示“掌握度低”，可那些题孩子早就烂熟于心了，完全是浪费时间。这不就是网上说的“伪智能”吗？光会给孩子贴标签，根本抓不住真正的学习漏洞&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;后来我跟一个在教育圈的朋友吐槽，她一句话点醒了我：“你买机器不看售后啊？在陕西这地界，你光在网上买个大牌货，出问题了找谁去？得找那种线下有根、有专门&lt;/span&gt;&lt;strong&gt;&lt;span&gt;陕西AI作业机代理商&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;给你兜底的那种！”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这话一下戳到我心窝子上了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说实话，咱们当家长的，最怕啥？最怕钱花了，孩子时间也搭进去了，结果机器就是个“答案搬运工”。孩子不会的题，它直接给答案，孩子抄完就完事，压根不走脑子。我朋友说她亲戚家的娃更绝，把作文题往机器里一输，范文就出来了，孩子改个名字就抄上去，关键是那篇范文写的“我的妹妹”，可人家孩子根本没有妹妹！你说吓不吓人&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span&gt;？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;所以我就琢磨开了，到底啥样的AI作业机才算靠谱？在咱陕西这块地方，咱们买机器到底图个啥？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;后来我专门跑了几趟电子市场，又托人打听，这才慢慢摸清了门道。现在市面上那些吹得天花乱坠的机器，真正核心的就那么几点：一是能不能&lt;/span&gt;&lt;strong&gt;&lt;span&gt;真批改&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，不是把“7”认成“9”；二是能不能&lt;/span&gt;&lt;strong&gt;&lt;span&gt;真讲解&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，不是直接甩答案，而是像老师那样启发引导，用那种手写板书式的一步步给你画图、列式，讲到你会为止；三是里面的课程和题库，跟不跟得上咱陕西孩子用的教材版本&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这几条，随便拎出来一条，网上那些通用大模型拼凑出来的机器就露馅了。为啥？因为它不懂教育，它只是个会说人话的引擎。真能让咱陕西娃提分的，还得是那种专门为教学场景打磨过的、有本地化服务支撑的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这也就是为啥我后来到处找靠谱的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;陕西AI作业机代理商&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。因为你要是从代理商手里拿货，他能给你讲明白这台机器的脾气秉性，能帮你把里面跟咱陕西教材同步的课程调出来，最关键的是，万一机器出点啥毛病，孩子用得不顺手，你不用对着400电话干着急，直接一个微信就能找到人给你解决。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;前几天，我总算在朋友介绍下，联系上了一家本地的代理商，就在西安高新区那边，据说还给一些学校供过货&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我去他们体验店坐了坐，让孩子当场试了一台作业帮的T60系列机器。那个“AI超级老师”确实有点意思，孩子指着一道应用题问，它不是直接给答案，而是先问孩子“你觉得题目里最关键的数字是哪个？”然后屏幕上就出现了手写笔迹，在题目上画圈、画线段图，一步一步引导&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我闺女当时就“哇”了一声，说：“妈妈，这个老师好有耐心啊，它不凶我！”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我站在旁边看着，心里五味杂陈。你说咱们当爹妈的，费尽心思不就是想找个能替咱们分忧、又不伤孩子自尊心的“老师”吗？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;那个代理商大哥人也实在，没跟我扯那些虚头巴脑的“AI大模型”“算法迭代”啥的，就实实在在地告诉我，这机器能干啥、干不了啥，还跟我说：“姐，你放心，机器买回去孩子要用着不习惯，你随时找我，咱们有本地服务群，真人老师在线答疑，晚上九点前都有人给你回。”我这一听，心里就有底了&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说实话，在陕西这地方买东西，不管是买啥，我都信一个理儿——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;有本地代理商的，靠谱！&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 为啥？因为跑得了和尚跑不了庙啊。那些网上直发的，你找谁去？所以我现在也学精了，买这种给孩子用的大家电，必须先找&lt;/span&gt;&lt;strong&gt;&lt;span&gt;陕西AI作业机代理商&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;问清楚，能不能线下体验？有没有售后？能不能根据咱陕西的教材做个性化设置？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这几样都问清楚了，我才敢掏钱。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;最后我也总结了一下，咱们当家长的，千万别再被那些商家的宣传语忽悠了。什么“16亿题库”“AI黑科技”，都是虚的。咱就看一点：这机器能不能让孩子学会“思考”，而不是学会“抄答案”。要是能找到一家靠谱的本地代理商，能给你提供持续的服务和指导，那这笔钱，才花得值当。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h3&gt;&lt;span&gt;网友问答&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“糖豆妈妈”提问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我娃上初一了，数学老是跟不上，想买学习机但又怕他拿去抄答案，有没有那种能防着孩子抄答案、还能针对错题讲解的机器推荐？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 糖豆妈妈，你的担心太真实了！我当初也是怕这个。说实话，市面上很多机器确实有这个毛病，孩子一搜题答案就出来了，久而久之就养成了依赖。但现在一些新款机型，比如作业帮的P60或者T60系列，在这方面做了不少优化。你找陕西AI作业机代理商的时候，可以重点问一下有没有“作业全托管”或者“家长管控”的功能。比如有些机器，孩子拍照搜题后，不会直接弹出答案，而是先弹出讲解视频或者思路引导，孩子得跟着老师的引导一步步走，最后自己算出答案。而且家长手机端能看到孩子今天搜了啥题、用了多久、错题本里有哪些，这样咱们心里就有数了。最靠谱的办法还是直接去代理商的体验店，让孩子当场试一道题，看看机器是给答案还是给思路，一试便知。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“老陕爸爸”提问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 咱陕西这边用的教材版本（比如北师大版、人教版）跟其他地方不太一样，我怕买回来的学习机内容对不上，这咋整？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 哎呀，这个问题问到点子上了！我当初也是因为这个原因，坚决要找本地代理商。你看网上那些直接发货的，它可能给你默认装的是全国通用版，但咱陕西有些学校用的是北师大版数学，或者人教版语文，版本对不上，里面的同步课程和练习册就全白瞎了。所以我建议你，不管看中哪款机器，找陕西AI作业机代理商的时候，第一件事就是问：能切换成陕西用的教材版本吗？里面的题库和试卷，有没有跟咱本地学校同步的更新？靠谱的代理商手里，一般都有针对咱们陕西的定制化资源包，甚至能根据你孩子学校的教学进度来调整。我当时试的那台机器，打开就能选西安市、选孩子年级，甚至能选到具体的教材版本，这才叫真同步&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。你就记住，能在线下给你演示清楚的，才是真本事。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“静静妈”提问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我娃写作文最愁人了，半天憋不出一个字，学习机的作文辅导功能真的有用吗？会不会又变成抄范文？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 静静妈，这个问题我可太有发言权了。我闺女以前也这样，作文全靠“挤牙膏”。后来我试的那台机器里有个“1对1写作私教”的功能，我觉得思路特别好。它不是直接给范文，而是先跟你聊天，问“你想写哪件事啊？”“那件事里你印象最深的是什么？”“当时你心里什么感觉？”它会引导孩子从生活细节里找素材，先把框架搭起来，再让孩子往里填内容&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。而且你要注意，很多AI作文批改就是给几句万能评语，但真正好的机器，会针对你写的句子，给出具体的修改建议，比如“这里可以加一个比喻”“这里的情感可以更强烈一些”。当然，还是那句话，这东西得你自己去看、去试。你可以带孩子去代理商那里，当场让他写个开头，让机器“带着写”一遍，感受一下那种引导式的过程，孩子如果觉得“这个机器人是在帮我，不是在替我写”，那这功能就买对了。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 07:21:02 +0800</pubDate></item><item><title>青岛AI电销机器人代理哪家好？别再瞎找了，听我这个跑过上百家厂子的过来人唠唠</title><link>http://www.sxkekun.com/a/7169.html</link><description>&lt;p&gt;&lt;span&gt;前几天我去胶州那边见一个做汽车线束胶带的老哥，姓贺，厂子不大，也就二十来号人。我俩喝茶的时候他跟我显摆，说正月十五那天上了个AI电销机器人，你猜怎么着？&lt;/span&gt;&lt;p&gt;&lt;img src=&quot;https://img0.baidu.com/it/u=4217922265,405600534&amp;fm=253&amp;app=53&amp;size=w438&amp;n=0&amp;g=0n&amp;f=jpeg&amp;fmt=auto?sec=1781218262&amp;t=392f2278b50dd8be7d3824d754e19371&quot;&gt;&lt;/p&gt;&lt;strong&gt;&lt;span&gt;一个小时后来了10个意向客户，当天下午就成交了仨！&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我当时就愣住了，心说这不扯呢吗？我干这行这么多年，头一回听说有这么邪乎的事儿。结果他给我看了后台数据，好家伙，两周拨出去2.8万通电话，拿下35个新客户，其中一个湖北的老板愣是没听出来电话那头是个机器人 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;说实话，我回来之后好几天没睡踏实。咱青岛这边做生意的都清楚，现在人工成本涨得吓人，招个销售底薪就得四五千，还得培训仨月，能不能开单全看命。尤其是咱们这种制造业、商贸流通的，天天让业务员背个包扫街，跑断腿也覆盖不了几个客户。贺伟那老哥以前也这样，自己扛着90%的销售任务，招个人去陕西跑四个月，订单没见着几个，油钱倒花了不少 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://n.sinaimg.cn/auto/transform/355/w660h495/20210618/7414-krpikqf7798336.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;所以回来我就琢磨，到底&lt;/span&gt;&lt;p&gt;&lt;img src=&quot;https://img0.baidu.com/it/u=2846732136,768961665&amp;fm=253&amp;app=53&amp;size=w438&amp;n=0&amp;g=0n&amp;f=jpeg&amp;fmt=auto?sec=1781218262&amp;t=52bfe9e476e27fc7fa751a46e39bd018&quot;&gt;&lt;/p&gt;&lt;strong&gt;&lt;span&gt;青岛ai电销机器人代理哪家好&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;？我这人做事儿较真，把市面上能跑的几家都摸了一遍，今天就跟大伙儿掏心窝子聊聊，怎么挑才能不踩坑。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img1.baidu.com/it/u=173974632,1915140490&amp;fm=253&amp;app=53&amp;size=w438&amp;n=0&amp;g=0n&amp;f=jpeg&amp;fmt=auto?sec=1781218262&amp;t=838a6e96f61a481ef542e5d5c17d4ae1&quot;&gt;&lt;/p&gt;&lt;h2&gt;&lt;span&gt;别光听价格，得看这玩意儿有没有“脑子”&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://preview.21cnjy.net/files/ae/b0/aeb094f666a5dc8e5cf9062e74a4dcdf.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我发现很多人有个误区，觉得电销机器人就是个自动拨号的录音机。兄弟，你要是这么想就大错特错了。真正好用的玩意儿，它得能跟人“唠”起来。我在崂山那边看了一家叫畅联达的，他们给贺伟供的那个“创销宝”智能体，集成了通义千问、豆包这些大模型 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。啥概念？就是你跟它说话，它能听出来你是真有兴趣还是在敷衍，能跟你多轮对话，而不是死板地念稿子。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;有一回我现场看演示，机器人打电话过去，客户说“我现在忙着呢”，普通机器可能就挂断了，但这个玩意儿它会说“那您先忙，我晚点再给您致电，方便留个微信吗？”就这一下，意向客户的留存率蹭蹭往上涨。所以你选代理的时候，一定得问清楚了，底层接的是哪家的语音识别，科大讯飞还是阿里云？能不能支持打断？识别率低于90%的，趁早让他走人 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;“AI筛选+人工跟进”，这个模式你得接得住&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;贺伟那老哥跟我说了一句话，我觉得特别在理。他说：“AI不是来取代人的，是来给咱员工加翅膀的。” &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 他以前那个销售团队士气低，为啥？因为业务员每天打几百个电话，大部分被挂断，偶尔接起来的也是骂人的，时间长了谁也受不了。现在好了，AI把前期的筛选、判断、初步沟通全干了，只把那些真正有意向的客户推到业务员微信上。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这就是我讲的“两条腿走路”。你要是光买了机器人，后面没人跟进，那等于白瞎。好的代理商会教你搭建这套体系，甚至像畅联达那样，有“陪跑”服务，帮你培训团队怎么承接这波流量 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我认识一个做教育培训的，上了机器人之后，招生转化率直接干到了18%，比传统电销高了4倍 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。为啥？因为销售的精力和时间都花在了刀刃上，跟那些高意向客户谈感情、谈方案，而不是跟防火墙较劲。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;别光看功能，得看它懂不懂你这一行&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;前几天我去城阳看了一家，号称功能特别全，什么都能干。结果一问，他们主攻的是金融和教育，对我做的那个工业设备一窍不通，话术库还得我自己编。我当时就火了，我要是什么都懂我还找你干嘛？好的代理，手里得有你们行业的沉淀数据。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你像做汽车线束胶带的，它的潜在客户是哪些？是那些汽车主机厂、配套厂。好的AI系统能利用全网级的企业数据库，精准筛查出这9万多家企业 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。而不是像个无头苍蝇一样，把电话打到卖煎饼果子的大哥那儿去，这不浪费钱嘛。所以你得问代理商，有没有你们行业的成功案例？有没有现成的话术模板？&lt;/span&gt;&lt;strong&gt;&lt;span&gt;青岛ai电销机器人代理哪家好&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，就看他能不能把你这个行业的“黑话”和门道，教给机器人。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;价格这事儿，便宜的往往最贵&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;我还发现一个怪现象，市面上有些代理报价特别低，几百块钱一个月，听着跟白捡似的。但你仔细一扒，线路不稳定，动不动被封号；后台数据导出还要加钱；最关键的是，那个语音识别稀烂，客户说啥它听不懂，驴唇不对马嘴。这玩意儿用了不仅没效果，还把客户得罪光了，号码也废了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你看正规的中标项目，像青岛国信那边之前采买的AI外呼服务，一个坐席一个月要1484元 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。这个钱花在哪了？花在稳定的线路、精准的识别、还有持续的话术优化上。好的系统比如云橘科技那种，用的是阿里云加科大讯飞双引擎识别，还能记录每一通电话录音，自动把客户分成ABCD等级 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。这才是值钱的地方。&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;写在最后&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;所以说，回到咱最开始那个问题，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;青岛ai电销机器人代理哪家好&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;？我觉得没有绝对的最好，只有最合适。你得看他有没有本地化的服务团队，能不能在你遇到问题的时候上门给你调，而不是让你打400电话排队。另外，一定要看他的技术底子，是不是接了大模型，能不能真的理解客户意图。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;我现在自己也弄了一套在用，说实话，那种“幸福的烦恼”我算体会到了。贺伟说他现在忙得连聚餐时间都没有，要把今年营收目标定在40% &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。我也是，以前愁没客户，现在愁客户太多，团队跟不上。但这话说出来有点欠揍，对吧？哈哈。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;好了，今儿就跟大家唠这么多，希望能帮兄弟们少走点弯路。下面有几个网友留言问得挺多的，我顺手给回一下，你们看看有没有类似的困惑。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“即墨老张”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我就怕买了这玩意儿之后，售后没人管，出了问题找谁去？本地代理商到底有啥优势？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 老张，你这问题问到点子上了！我跟你说，&lt;/span&gt;&lt;strong&gt;&lt;span&gt;本地代理和非本地代理，那差别大了去了&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。非本地的，你打400电话，转人工得转三分钟，好不容易接通了，对面还听不懂你说的“青岛话”里的那点事儿。咱青岛人实在，做生意讲究个“脸熟”。我之前选的那家，人家就在崂山区有研发中心 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;，我开车过去半个点，直接坐他们工位上，看着技术员给我调话术。有一次我这边线路出了点问题，一个电话过去，人家下午就带着笔记本上门来了，当场测试，当场解决。这要是换成外地代理，你急得跳脚，他也只能在电话里跟你念说明书。所以选代理，一定要选在青岛有本地团队的，哪怕贵个几百块钱，这个钱买的是心安，买的是随叫随到的服务。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“李沧小王”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我就是个做小本生意的，就几个人，用这个机器人会不会很复杂？我怕我学不会，员工也抵触。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 小王啊，你这个担心我太理解了。我刚开始也怕，咱又不是搞IT的，弄个后台跟看天书似的。但你真上手了就会发现，其实简单得要命。现在的系统都做得跟微信似的，傻瓜式操作。我就说那个后台，你打开就是一个大看板，今天打了多少电话、筛选出几个意向客户、谁在微信上等着你去聊，一目了然 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。最骚的操作是，那个机器人能直接把意向客户推到你微信上，你手机一震，点开就是客户的微信名片和对话记录，你直接加好友聊就完事儿了，根本不用你去后台导出数据。至于员工抵触？我一开始也怕业务员觉得机器人来抢饭碗。后来我跟他们开会，我说这玩意儿是给你们配的“助理”，以后那些挨骂的、重复的破事儿都让它干，你们就负责跟好客户喝喝茶、谈谈单子。结果你猜怎么着？现在他们每天都抢着看手机，生怕漏掉一个高意向客户，士气比我还高 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;！这玩意儿不是来抢饭碗的，是来把饭碗给你换成金饭碗的。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;网友“市北刘姐”问：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 我担心客户一听是机器人就直接挂了，或者反感，这咋解决？会不会影响我品牌形象？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答：&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 刘姐，你这个担心太正常了，谁不怕被客户骂呀？但你得这么想，客户烦的不是AI，烦的是那些“听不懂人话”的骚扰电话。好的AI电销机器人，它不叫机器人，它叫“数字员工”。我给你举个例子，贺伟那边成交的湖北客户，聊到最后都不知道对方是个AI，还以为是销售小李呢 &lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 2px 4px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22396px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。为啥？因为这个AI用的是真人的录音，语气、停顿、甚至“嗯、啊”这些语气词都模仿得特别自然。最关键的是它听得懂人话，客户问啥它都能接住，不会答非所问。这就好比你去银行办事，有时候电话客服也是AI，但你为啥不挂？因为它能解决你的问题。所以我们选机器人的时候，一定要让代理商给你试听，听听这个话术是不是生硬，能不能做到“千人千面”。另外，系统还有个功能，能自动过滤掉那些明确表示反感或者没需求的号码，绝对不会反复骚扰，保护了咱的品牌形象。只要话术设计得真诚，能解决客户问题，客户根本不在乎对面是人是AI，他只在乎你能不能给他提供价值。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 06:51:01 +0800</pubDate></item><item><title>问答助手AI深度拆解：JIT编译、AOT编译与Java预热，2026年你该掌握哪些核心要点？</title><link>http://www.sxkekun.com/a/7168.html</link><description>&lt;p&gt;&lt;strong&gt;&lt;span&gt;发布日期&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：2026年4月9日（北京时间）&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;你是否经历过这样的场景：刚上线的 Java 服务，前几十个请求响应时间长达数秒，调用方频繁超时报警；而当服务运行几分钟后，一切又恢复正常，性能表现判若云泥。这正是许多 Java 开发者在日常工作中遇到的典型痛点——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;只知道代码“跑着跑着就变快了”，却说不出背后的原理&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;；在面试中被问到 JIT 和 AOT 的区别时，只能模糊回答“一个是运行时编译，一个是提前编译”；面对线上服务的预热问题，往往手足无措、不知从何排查。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://e.thsi.cn/img/b1349c703a484c85&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;本文将系统梳理 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;JIT 即时编译、AOT 提前编译与 Java 预热&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 三大核心知识点，从底层原理到代码示例，从面试考点到生产实践，带你建立完整的技术知识链路。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;一、痛点切入：为什么我们同时需要JIT与AOT？&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://k.sinaimg.cn/n/sinakd20260315s/228/w1604h1024/20260315/5cd2-17929f21035cd27defc564496b905705.png/w700d1q75cms.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;让我们从一个最直观的问题开始：Java 代码是如何被计算机执行的？&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;传统理解中，Java 遵循“一次编写、到处运行”的理念——源代码先被 &lt;/span&gt;&lt;code&gt;javac&lt;/code&gt;&lt;span&gt; 编译成平台无关的字节码（.class 文件），再由 JVM 的解释器逐行解释执行。解释执行有一个致命的性能短板：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;每次执行同一条字节码指令，都要重新经历“解释→执行”的过程&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，效率远低于直接运行机器码&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 3.40191px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;21&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;打个比方，这就像每次去餐厅点同样的菜，厨师都要重新翻看菜谱、备料、烹饪；而不是把常点的几道菜提前备好，来了就能上桌。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;为了弥补解释执行的性能劣势，JVM 引入了 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;JIT（Just-In-Time，即时编译）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 技术：在程序运行过程中，将高频执行的热点代码动态编译成本地机器码并缓存，后续调用直接执行机器码，从而大幅提升性能&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。JIT 并非万能——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;运行时编译需要时间，这就产生了“预热”问题&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;与此同时，以 GraalVM Native Image 为代表的 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;AOT（Ahead-Of-Time，提前编译）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 技术应运而生，它试图在构建阶段就完成编译工作，彻底消除运行时的编译开销&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.67535px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;32&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;两种编译策略各有优劣，理解它们的设计初衷与权衡，是每个 Java 开发者绕不开的必修课。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;二、核心概念讲解：JIT即时编译&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;2.1 什么是JIT编译？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;JIT（Just-In-Time，即时编译）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 是一种在程序运行时将字节码动态编译为本地机器码的技术&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.77691px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;69&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。它并非一股脑地编译所有代码，而是&lt;/span&gt;&lt;strong&gt;&lt;span&gt;有选择地编译热点代码&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，从而在“编译开销”与“性能收益”之间取得平衡。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;2.2 JIT的工作原理：热点探测与分层编译&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;JIT 的启动依赖一个关键机制——&lt;/span&gt;&lt;strong&gt;&lt;span&gt;热点探测&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。JVM 通过两类计数器来识别热点代码：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;方法调用计数器&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：统计方法被调用的次数&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;循环回边计数器&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：统计循环体的执行次数，可触发栈上替换（OSR，On-Stack Replacement），在循环执行过程中直接替换为编译后的代码&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;当计数达到预设阈值时，JIT 编译器便会介入。HotSpot JVM 内置了两个即时编译器：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:138px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;编译器&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;特点&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;适用场景&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;C1（Client Compiler）&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;启动快，优化轻量（内联、常量传播等）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;客户端应用、对启动时间敏感的场景&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;C2（Server Compiler）&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;编译慢，优化激进（逃逸分析、向量化等）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;服务端、长时间运行的后台程序&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;自 Java 7 引入、Java 8 默认启用的 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;分层编译&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 策略，将二者的优势完美结合。整个编译过程被划分为 5 个层次&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;text&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;第0层 → 解释执行，收集性能数据&lt;/span&gt;
&lt;span&gt;第1层 → C1编译（无 Profiling），快速生成代码&lt;/span&gt;
&lt;span&gt;第2层 → C1编译（基础 Profiling）&lt;/span&gt;
&lt;span&gt;第3层 → C1编译（完整 Profiling），为 C2 准备详细数据&lt;/span&gt;
&lt;span&gt;第4层 → C2编译，基于 Profiling 数据进行激进优化&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;这种渐进式的编译策略，使得应用在启动初期能够快速响应，在运行过程中逐渐逼近峰值性能。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;2.3 类比理解：同声传译 vs. 全文翻译&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;如果说解释执行是“同声传译”——逐句翻译，随翻随说，启动快但整体效率一般；那么 JIT 就是“全文翻译”——先把文档全文读一遍，找出高频段落重点优化，虽然前期需要时间，但后续执行效率极高&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;三、关联概念讲解：AOT提前编译&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;3.1 什么是AOT编译？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;AOT（Ahead-Of-Time，提前编译）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 是一种在应用程序运行之前，将源代码或字节码提前编译为本地机器码的技术&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.93316px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;46&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。典型实现包括：Android 的 ART 运行时、GraalVM Native Image，以及 Java 9 中引入的 &lt;/span&gt;&lt;code&gt;jaotc&lt;/code&gt;&lt;span&gt; 工具。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;3.2 AOT的工作原理&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;与 JIT 不同，AOT 在&lt;/span&gt;&lt;strong&gt;&lt;span&gt;构建阶段&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;完成全部编译工作。以 GraalVM Native Image 为例，其核心流程包括&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.67535px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;32&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;封闭世界分析（Closed-World Analysis）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：构建时扫描所有可达代码路径，确定最终包含的类、方法和字段&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;堆快照持久化&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：将初始化后的对象直接写入镜像，减少运行时初始化开销&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;SubstrateVM&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：一个轻量级运行时，仅保留 GC、线程调度等基础功能，替代完整的 JVM&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;span&gt;3.3 AOT的性能优势（真实数据）&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;以典型的 Spring Boot 应用为例，GraalVM Native Image 相比传统 JVM 能带来显著的性能提升&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.67535px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;32&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:138px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;指标&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;OpenJDK 17&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;GraalVM Native Image&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;优化幅度&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;启动时间&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;2.8 秒&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;0.05 秒&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;98.2%&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;内存占用&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;210 MB&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;38 MB&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;81.9%&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;span&gt;AOT 编译还有充足的时间进行深度定制化优化，比如针对特定处理器的 AVX2、AVX-512 高级指令集进行适配，甚至可以结合目标平台的内存层级结构，将频繁访问的数据优先映射到 L1 缓存中&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;四、概念关系与区别总结&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;JIT 与 AOT 本质上是 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;编译时机&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 的不同选择——是在运行时按需编译，还是在构建期一次性完成。下表从多个维度进行对比&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.93316px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;48&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;ds-scroll-area ds-scroll-area--show-on-focus-within _1210dd7 c03cafe9&quot;&gt;&lt;div class=&quot;ds-scroll-area__gutters&quot; style=&quot;--container-height:322px; position: sticky; top: 0px; left: 0px; right: 0px; width: 100%; height: 0px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-gutter&quot; style=&quot;left: 0px; right: 0px; display: block; top: calc(var(--container-height) - 14px); height: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__horizontal-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ds-scroll-area__vertical-gutter&quot; style=&quot;right: 0px; top: 8px; bottom: calc(0px - var(--container-height) + 8px); width: 10px;&quot;&gt;&lt;div class=&quot;ds-scroll-area__vertical-bar&quot; style=&quot;display: none;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table&gt;&lt;tr&gt;&lt;th&gt;&lt;span&gt;对比维度&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;JIT（即时编译）&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span&gt;AOT（提前编译）&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;编译时机&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;程序运行期间&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;程序构建期间&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;启动速度&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较慢（需预热）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较快（无需编译）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;峰值性能&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;更高（运行时优化）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;接近 JIT 水平&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;内存占用&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较少（动态加载）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;较多（一次性加载）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;跨平台性&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;强（字节码运行）&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;弱（绑定目标平台）&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;span&gt;典型场景&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;后端服务、高并发系统&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;云原生、Serverless、嵌入式&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;一句话总结&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：&lt;/span&gt;&lt;strong&gt;&lt;span&gt;JIT 是“运行时学习”的渐进优化，AOT 是“提前预习”的一步到位。&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 二者并非相互替代，而是在不同场景下互为补充。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;五、代码示例：直观感受JIT的效果&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;下面这段代码可以直观地展示 JIT 编译带来的性能提升：&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;md-code-block md-code-block-light&quot;&gt;&lt;div class=&quot;md-code-block-banner-wrap&quot;&gt;&lt;div class=&quot;md-code-block-banner md-code-block-banner-lite&quot;&gt;&lt;div class=&quot;_121d384&quot;&gt;&lt;div class=&quot;d2a24f03&quot;&gt;&lt;span class=&quot;d813de27&quot;&gt;java&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;d2a24f03 _246a029&quot;&gt;&lt;div class=&quot;efa13877&quot;&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;复制&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;div class=&quot;ds-icon ds-atom-button__icon&quot; style=&quot;font-size: 16px; width: 16px; height: 16px; margin-right: 3px;&quot;&gt;&lt;/div&gt;&lt;span&gt;&lt;span class=&quot;code-info-button-text&quot;&gt;下载&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;ds-focus-ring&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;span&gt;&lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;JITDemo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;long&lt;/span&gt; start &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nanoTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 循环执行同一个方法，模拟热点代码的触发&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            &lt;span class=&quot;token function&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;long&lt;/span&gt; end &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nanoTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token class-name&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;总耗时：&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;end &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; start&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; ms&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 该方法会被 JIT 识别为热点并编译&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;            result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; value &lt;span class=&quot;token operator&quot;&gt;&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;预期现象&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：前几千次调用时，&lt;/span&gt;&lt;code&gt;compute&lt;/code&gt;&lt;span&gt; 方法以解释模式执行，耗时较长；当方法调用次数达到编译阈值（约 1,000~10,000 次，取决于 JVM 模式和版本）后，JIT 将字节码编译为本地机器码，后续调用的执行速度显著提升&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;可以使用 &lt;/span&gt;&lt;code&gt;-XX:+PrintCompilation&lt;/code&gt;&lt;span&gt; 参数启动程序，观察控制台输出，直观地看到哪些方法被 JIT 编译了。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;六、底层原理支撑：JIT如何实现运行时优化？&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;JIT 编译器的强大之处，在于它能够利用 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;运行时 Profiling 数据&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 做出传统静态编译器无法实现的激进优化&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 2.22222px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;方法内联（Inlining）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：将高频调用的方法直接嵌入调用方，消除方法调用开销&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;逃逸分析（Escape Analysis）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：判断对象是否逃逸出当前线程/方法，若未逃逸则进行栈上分配或标量替换，减少 GC 压力&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;循环优化（Loop Optimizations）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：包括循环展开、循环不变量外提等&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;窥孔优化与寄存器分配&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：在机器码层面进一步精调&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;这些优化能够使 Java 应用的&lt;/span&gt;&lt;strong&gt;&lt;span&gt;峰值性能接近甚至超越静态编译的 C++ 代码&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。不过，JIT 的优化建立在“运行时的假设”之上——如果假设不成立（例如内联的虚方法在运行时被覆盖），JVM 会触发 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;逆优化（Deoptimization）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; 回退到解释执行，保证程序正确性&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.75347px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;38&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;七、高频面试题与参考答案&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;span&gt;Q1：什么是 JIT 编译？它和 AOT 编译有什么区别？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答题要点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：定义清晰 + 时机对比 + 场景区分&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JIT（Just-In-Time，即时编译）是在程序运行过程中，将热点代码动态编译成本地机器码的技术。AOT（Ahead-Of-Time，提前编译）则是在程序运行之前就完成编译。JIT 的优势是能基于运行时数据进行深度优化，峰值性能更高，但存在预热开销、启动较慢；AOT 的优势是启动快、内存占用低，适合云原生和 Serverless 场景，但缺乏运行时动态优化能力，且跨平台性较差。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h3&gt;&lt;span&gt;Q2：Java 中的分层编译是什么？为什么需要它？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答题要点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：5层结构 + C1/C2分工 + 启动与性能的平衡&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：分层编译是 HotSpot JVM 自 Java 7 引入、Java 8 默认启用的编译策略。它将编译过程划分为 5 个层次：第 0 层解释执行收集数据；第 1~3 层由 C1 编译器在不同 Profiling 粒度下编译；第 4 层由 C2 编译器进行激进优化。分层编译解决了单一编译器的矛盾——C1 启动快但优化弱，C2 优化强但启动慢。通过分层策略，应用既能快速启动（解释 + C1），又能在长期运行中达到峰值性能（C2）。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h3&gt;&lt;span&gt;Q3：什么是 Java 预热？为什么服务刚启动时性能较差？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答题要点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JIT触发机制 + 热点探测阈值 + 生产影响&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：Java 预热指的是应用从启动到达到峰值性能之间的过渡阶段。刚启动时，代码以解释模式执行，性能较差；随着热点代码被识别并触发 JIT 编译，性能逐步提升。预热问题的本质在于 JIT 编译需要时间和 CPU 资源。在生产环境中，若刚启动的实例直接承接大量流量，可能因编译开销导致请求超时甚至系统崩溃&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.44878px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;55&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h3&gt;&lt;span&gt;Q4：如何解决或缓解 Java 应用的预热问题？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答题要点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：多种方案 + 适用场景说明&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：常见解决方案包括：&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;启动预热脚本&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：在正式流量到来前，提前调用关键接口，触发 JIT 编译&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;流量灰度接入（优雅启动）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：通过负载均衡为新实例分配低权重，逐步增加流量比例&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.44878px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;55&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;调整 JIT 编译阈值&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：使用 &lt;/span&gt;&lt;code&gt;-XX:CompileThreshold=1000&lt;/code&gt;&lt;span&gt; 等参数提前触发编译&lt;/span&gt;&lt;span class=&quot;ds-markdown-cite&quot; style=&quot;display: inline; cursor: pointer; padding: 1.59259px 4px 1.59259px;&quot;&gt;&lt;span style=&quot;opacity: 0; margin: 0px 4.85503px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;42&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;使用 AOT 编译（GraalVM Native Image）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：彻底消除运行时编译开销&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;使用 CRaC（Coordinated Restore at Checkpoint）&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：通过检查点恢复技术跳过预热阶段&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;hr&gt;&lt;h3&gt;&lt;span&gt;Q5：JIT 和 AOT 在云原生场景下如何选择？&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;答题要点&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：场景驱动 + 权衡取舍&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;参考答案&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：对于需要快速启动、弹性伸缩的云原生场景（如 Serverless、FaaS），AOT 更具优势——启动时间可降至毫秒级，内存占用降低 5~10 倍。但对于需要长期运行、对峰值性能有极致要求的后端服务，JIT 的运行时优化能力仍是不可替代的。2026 年的趋势是 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;混合编译&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：用 AOT 保证启动速度，用 JIT 在运行时持续优化热点代码，二者结合实现“启动即峰值”&lt;/span&gt;&lt;span class=&quot;_2ed5dee&quot; style=&quot;display: inline; cursor: pointer;&quot;&gt;&lt;span style=&quot;opacity: 0;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);&quot;&gt;&lt;span class=&quot;_49c6e07&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;h2&gt;&lt;span&gt;八、结尾总结&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;本文围绕 Java 性能优化的三大核心概念展开：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;JIT 即时编译&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：运行时将热点代码编译为机器码，通过分层编译平衡启动速度与峰值性能&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;AOT 提前编译&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：构建期完成编译，启动极快、内存占用低，适合云原生场景&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span&gt;✅ &lt;/span&gt;&lt;strong&gt;&lt;span&gt;Java 预热&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JIT 编译的必然代价，可通过预热脚本、流量灰度等方式缓解&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;重点提醒&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;：JIT 与 AOT 并非零和博弈，而是&lt;/span&gt;&lt;strong&gt;&lt;span&gt;不同场景下的互补技术&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;。理解它们的底层原理与权衡逻辑，远比死记硬背八股文更为重要。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;下一篇文章，我们将深入 &lt;/span&gt;&lt;strong&gt;&lt;span&gt;GraalVM Native Image 的实战配置与调优技巧&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;，带你亲手将一个 Spring Boot 应用 AOT 编译成毫秒级启动的原生可执行文件，敬请期待！&lt;/span&gt;&lt;/p&gt;
&lt;hr&gt;&lt;p&gt;&lt;em&gt;&lt;span&gt;本文数据来源于 OpenJDK 官方文档、GraalVM 官方 Benchmark 及主流云厂商性能测试报告，截至 2026 年 4 月。&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 05:36:01 +0800</pubDate></item></channel></rss>