<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on 现代技能栈</title><link>https://xiaoping378.github.io/tags/java/</link><description>Recent content in Java on 现代技能栈</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://xiaoping378.github.io/tags/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Go转Java万字总结, 要跨越哪些思维鸿沟</title><link>https://xiaoping378.github.io/docs/3-devops/javaer/1-go-to-java/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xiaoping378.github.io/docs/3-devops/javaer/1-go-to-java/</guid><description>&lt;div class="pageinfo pageinfo-primary"&gt;
&lt;p&gt;主要介绍Go和java间的设计思想、工程目录结构、典型框架使用上的对比&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id="go转java的设计思想对比"&gt;Go转Java的设计思想对比&lt;a class="td-heading-self-link" href="#go%e8%bd%acjava%e7%9a%84%e8%ae%be%e8%ae%a1%e6%80%9d%e6%83%b3%e5%af%b9%e6%af%94" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class="alert alert-primary" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;欲速则不达&lt;/div&gt;
&lt;p&gt;先看思想差异! &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Go的心智模式是过程式 + 轻量级面向对象 + 并发，从接需求开始，要识别结构体和关键方法，先实现小而美的功能点，再通过组合演进式地实现复杂功能。
Java不用说了，主要是以重量级OOP为主的玩法，要从需求中先找实体，加行为，定关系，用设计模式实现更复杂的业务。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不过现代Java也在拥抱轻量级设计, 而Go里也有设计模式，不过更倾于使用函数、闭包和通道等语言特性来解决。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先从直观语法上，总结有以下几种差异情况（只总结差异，不做优劣评价）：&lt;/p&gt;
&lt;p&gt;Go: 极简主义​ - 少即是多, Go语法中有很多隐含的写法规则，在Java里则需要编写显式的修饰符（关键字）声明，比如某结构（类）中，首字母大写，是会暴露一个字段，在java则需要显示的使用public。&lt;/p&gt;
&lt;h3 id="隐式规则与显式声明的碰撞"&gt;隐式规则与显式声明的碰撞&lt;a class="td-heading-self-link" href="#%e9%9a%90%e5%bc%8f%e8%a7%84%e5%88%99%e4%b8%8e%e6%98%be%e5%bc%8f%e5%a3%b0%e6%98%8e%e7%9a%84%e7%a2%b0%e6%92%9e" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go的&amp;quot;命名即契约&amp;quot;哲学：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-Go" data-lang="Go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 大小写决定可见性&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;User&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;ID&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;int&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 公开&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;name&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 私有&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(u&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;User)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;GetName&lt;/span&gt;()&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 公开方法&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;u.name&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;(u&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;*&lt;/span&gt;User)&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;setName&lt;/span&gt;(name&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;string&lt;/span&gt;)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 私有方法&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;u.name&lt;span style="color:#bbb"&gt; &lt;/span&gt;=&lt;span style="color:#bbb"&gt; &lt;/span&gt;name&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Java语法层面的&amp;quot;显式声明&amp;quot;文化：&lt;/p&gt;</description></item><item><title>AI时代下，Java该如何起手项目开发</title><link>https://xiaoping378.github.io/docs/3-devops/javaer/2-java-starter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xiaoping378.github.io/docs/3-devops/javaer/2-java-starter/</guid><description>&lt;div class="pageinfo pageinfo-primary"&gt;
&lt;p&gt;30多年来，开发者工具层面终于出现了革命者，本文主要结合人工智能在软件工程领域大行其道的当下，针对从零开始和迭代已有项目，介绍如何快速开启Java项目的设计开发。&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;最近常听到一句话，&lt;code&gt;AI不会替代你，但熟练使用AI的人可以轻松干废你&lt;/code&gt;。 初听有点儿耸人听闻，实际却在发生中.... 甚至斯坦福大学最近也开设了&lt;a href="https://themodernsoftware.dev/"&gt;CS146S课程&lt;/a&gt;， 要求必须使用AI完成开发任务，作业是提交完成开发任务的提示词prompt。专门教授如何将大模型和AI工具（如编程智能体、AI IDE）集成到软件开发流程中，从而大幅提升开发者的生产力，并探讨了现代软件工程师的角色演变。课程大纲如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-18-08-58-40.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="工欲善其事必先利其器"&gt;工欲善其事必先利其器&lt;a class="td-heading-self-link" href="#%e5%b7%a5%e6%ac%b2%e5%96%84%e5%85%b6%e4%ba%8b%e5%bf%85%e5%85%88%e5%88%a9%e5%85%b6%e5%99%a8" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="传统开发-必备神器idea"&gt;传统开发，必备神器IDEA&lt;a class="td-heading-self-link" href="#%e4%bc%a0%e7%bb%9f%e5%bc%80%e5%8f%91-%e5%bf%85%e5%a4%87%e7%a5%9e%e5%99%a8idea" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下图是2025.3版本，安装包大小1G，包括java生态的大量工具插件，还内置了教学引导，默认给30天的免费旗舰试用期。
&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-17-15-11-08.png" alt="启动界面"&gt;
&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-17-15-57-41.png" alt="教学导引"&gt;&lt;/p&gt;
&lt;p&gt;导引学习，主要介绍一些快捷键(包括any搜索、补全建议、重构)和调试技巧等。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl+Shift+A或者两次Shift按键，触发anything search。&lt;/li&gt;
&lt;li&gt;Alt + Enter， 万能修复/提示&lt;/li&gt;
&lt;li&gt;Ctrl + Shift + Space​，智能代码补全&lt;/li&gt;
&lt;li&gt;Ctrl + Alt + L​，代码格式化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统IDE中，补全是当初能让其迅速普及开的功能之一，而调试也是另一个极好的功能。在现代AI IDE中，调试似乎也不需要了，直接贴错误日志，就自动开始debug纠错了。&lt;/p&gt;
&lt;h3 id="使用ai开发的现状"&gt;使用AI开发的现状&lt;a class="td-heading-self-link" href="#%e4%bd%bf%e7%94%a8ai%e5%bc%80%e5%8f%91%e7%9a%84%e7%8e%b0%e7%8a%b6" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当下主流的使用AI开发模式有3种基本形态：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一种是传统IDE + &lt;strong&gt;编程插件助手&lt;/strong&gt;，代表有Lingma、Continue等，是属于渐进式拥抱AI辅助开发，从而提高生产力的方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;另一种是基于开源IDE打造的&lt;strong&gt;AI原生IDE&lt;/strong&gt;, 提供更沉浸式的AI编程体验，由AI自主完成分析、设计、编码乃至测试的完整流程，一般需要订阅收费。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;国外：Cursor（基于VS Code）&lt;/li&gt;
&lt;li&gt;国内：Trae.CN（字节）、CodeBuddy（腾讯），Qoder（阿里.新加坡团队）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;还有一种&lt;strong&gt;终端工具&lt;/strong&gt;，代表是Claude Code、Codex CLI等，可以灵活集成到以上两种模式和其他第三方CI/CD协作流水线中&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在市场参与者，基本都在布局各形态的开发场景，本文发稿时，通义lingma也在公测IDE了，CodeBuddy已实现插件、IDE、CLI三端全形态覆盖。&lt;/p&gt;
&lt;p&gt;年初我个人也结合开源vscode+roocode插件，开发过一款自己的IDE，叫&lt;code&gt;aide&lt;/code&gt;，基本功能也都具备，后面有时间可以整理发出来一篇手把手打造自己的AI原生IDE。
&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-18-18-37-35.png" alt=""&gt;
&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-18-18-40-54.png" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不过github Copilot在国内市场才是比较可惜的，背靠微软（VS生态），手里有github，竟然在市场上，没有国外初创企业Cursor等的声势浩大。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这几种形态，反映了一个演进方向: 将AI集成到开发工具 ====&amp;gt; 将开发工具集成到AI中。人在其中的动手参与度逐步降低，后者看上去是最理想的终极形态，合理设置后，可以让AI把整个软件交付的全流程（需求分析-&amp;gt;设计-&amp;gt;编码-&amp;gt;测试-&amp;gt;部署上线）自动完成。&lt;/p&gt;
&lt;p&gt;不过这里不应该存在谁更好的说法，最终要看你的团队运作模式，是单人全栈还是严格‘瀑布模式’下的团队模式，毕竟康威定律还在生效（技术问题的背后，往往是人的问题和组织问题）。这类AI原生IDE现在也基本支持个人版和企业版了，不过从业内的实践来看，在单人全栈模式下，AI原生IDE的优势会更明显。&lt;/p&gt;
&lt;p&gt;由于本人工作行业限制，接触最多的是lingma，不过为了客观对比更高阶的形态，这里以Trae.CN为例&lt;/p&gt;
&lt;p&gt;安装包大小204M，内置前端工具链，如涉及其他技术栈，需要自行安装插件。 支持两种模式（IDE和solo模式），就是前面提到的IDE+插件助手模式和AI原生IDE的形态。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-18-18-26-52.png" alt="启动界面"&gt;
&lt;img src="https://xiaoping378.github.io/images/2-java-starter-2025-12-18-18-31-25.png" alt="solo模式"&gt;&lt;/p&gt;
&lt;p&gt;AI原生IDE，相对传统IDE，最大的区别是在软件工程中的参与阶段左移了，从需求分析开始就可以介入了，并且以AI为主导推理，自动调度集成MCP工具来推进工作。&lt;/p&gt;
&lt;h2 id="vibe-coding-氛围-ai结对编程"&gt;Vibe Coding 氛围/AI结对编程&lt;a class="td-heading-self-link" href="#vibe-coding-%e6%b0%9b%e5%9b%b4-ai%e7%bb%93%e5%af%b9%e7%bc%96%e7%a8%8b" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="零开项目-避免重复造轮子"&gt;零开项目（避免重复造轮子）&lt;a class="td-heading-self-link" href="#%e9%9b%b6%e5%bc%80%e9%a1%b9%e7%9b%ae-%e9%81%bf%e5%85%8d%e9%87%8d%e5%a4%8d%e9%80%a0%e8%bd%ae%e5%ad%90" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;java生态已经非常丰富，几乎每个领域都有对应成熟、经过验证的开源项目，遵循专业的事情找专业的工具干的原则（寻找轮子），避免让AI从零开始重复造轮子。&lt;/p&gt;</description></item><item><title>Goper直接撸java代码，真是操碎了心，tips总结①</title><link>https://xiaoping378.github.io/docs/3-devops/javaer/3-java-tips/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://xiaoping378.github.io/docs/3-devops/javaer/3-java-tips/</guid><description>&lt;div class="pageinfo pageinfo-primary"&gt;
&lt;p&gt;Java发展的这些年，为了复杂大型项目的工程实践能傻瓜落地，真是封了一层又一层啊，C/C++型选手转过来，会感觉各种看不透，总结了一些tips，尽量追根问底，分享给大家。&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id="springbootapplication-注解"&gt;@SpringBootApplication 注解&lt;a class="td-heading-self-link" href="#springbootapplication-%e6%b3%a8%e8%a7%a3" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;java spring项目，第一个看到的基本就是这个注解，只能加到main方法所在的主类上，标识这是一个Spring Boot应用程序的main入口类。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@(注解)的本质是给代码打标签，告诉需要处理注解的工具或框架: 这里的代码需要特殊处理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;“@SpringBootApplication”注解，是个组合注解，是表示要在程序启动运行阶段被特殊处理的(其实现完全依赖于Java的反射机制)，是spring框架的核心机制，依靠Spring容器的运行时处理能力，体现了「约定优于配置」的设计思想。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;没点儿Java经验，「约定优于配置」的设计思想，会让学习成本增加，但是在大型项目中，会让开发效率大大提高。
spring 容器的运行时处理能力，是实现「约定优于配置」的关键。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="spring-容器"&gt;Spring 容器&lt;a class="td-heading-self-link" href="#spring-%e5%ae%b9%e5%99%a8" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;spring 容器是一个IoC容器（简单理解为一个对象工厂），用于管理应用程序中的Bean对象。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bean的生命周期包括：实例化、依赖注入、初始化、使用、销毁。
依赖注入是指在运行时，通过容器自动将Bean的依赖对象注入到Bean中。
初始化是指在Bean实例化后，调用Bean的初始化方法。
使用是指在Bean初始化后，通过容器获取Bean实例，调用其方法。
销毁是指在应用程序关闭时，调用Bean的销毁方法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;简单来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你写好代码，贴上标签（注解）&lt;/li&gt;
&lt;li&gt;容器帮你管理这些代码（Bean）&lt;/li&gt;
&lt;li&gt;你需要什么，容器就给你什么（依赖注入）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="为什么要使用-spring-容器"&gt;为什么要使用 Spring 容器？&lt;a class="td-heading-self-link" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e4%bd%bf%e7%94%a8-spring-%e5%ae%b9%e5%99%a8" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;理由有一堆，还都是高大上的那种....&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;拿用户注册功能对比，举例说明，对比「不用Spring容器」和「用Spring容器」的代码差异，直观展示Spring容器的价值：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;场景：用户注册功能（需要3层结构）&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Controller ：接收注册请求&lt;/li&gt;
&lt;li&gt;Service ：处理注册业务逻辑（密码加密、保存用户）&lt;/li&gt;
&lt;li&gt;Repository ：操作数据库（保存用户信息）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;方式1：不用Spring容器 → 传统Java开发&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 1. Repository层：操作数据库&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#00f"&gt;UserRepository&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;void&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;save&lt;/span&gt;(User&lt;span style="color:#bbb"&gt; &lt;/span&gt;user)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;System.&lt;span style="color:#b44"&gt;out&lt;/span&gt;.&lt;span style="color:#b44"&gt;println&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;保存用户到数据库：&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;+&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;user.&lt;span style="color:#b44"&gt;getName&lt;/span&gt;());&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 2. Service层：业务逻辑&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#00f"&gt;UserService&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 必须手动创建依赖对象 → 「自己new」，初始化省略..&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;private&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserRepository&lt;span style="color:#bbb"&gt; &lt;/span&gt;userRepository&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserRepository();&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;void&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;registerUser&lt;/span&gt;(User&lt;span style="color:#bbb"&gt; &lt;/span&gt;user)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 密码加密（业务逻辑）&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;user.&lt;span style="color:#b44"&gt;setPassword&lt;/span&gt;(encryptPassword(user.&lt;span style="color:#b44"&gt;getPassword&lt;/span&gt;()));&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 调用Repository保存&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;userRepository.&lt;span style="color:#b44"&gt;save&lt;/span&gt;(user);&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;private&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;String&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;encryptPassword&lt;/span&gt;(String&lt;span style="color:#bbb"&gt; &lt;/span&gt;password)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;return&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;加密后的密码：&amp;#34;&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;+&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;password;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 3. Controller层：接收请求&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#00f"&gt;UserController&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 必须手动创建依赖对象 → 「自己new」&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;private&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserService&lt;span style="color:#bbb"&gt; &lt;/span&gt;userService&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserService();&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 可以改进为接收参数&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;void&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;handleRegisterRequest&lt;/span&gt;(String&lt;span style="color:#bbb"&gt; &lt;/span&gt;name,&lt;span style="color:#bbb"&gt; &lt;/span&gt;String&lt;span style="color:#bbb"&gt; &lt;/span&gt;password)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;User&lt;span style="color:#bbb"&gt; &lt;/span&gt;user&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;User();&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;user.&lt;span style="color:#b44"&gt;setName&lt;/span&gt;(name);&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;user.&lt;span style="color:#b44"&gt;setPassword&lt;/span&gt;(password);&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;userService.&lt;span style="color:#b44"&gt;registerUser&lt;/span&gt;(user);&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 4. 启动类：手动创建所有对象&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style="color:#00f"&gt;App&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;public&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;static&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#0b0;font-weight:bold"&gt;void&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#00a000"&gt;main&lt;/span&gt;(String&lt;span style="color:#666"&gt;[]&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;args)&lt;span style="color:#bbb"&gt; &lt;/span&gt;{&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 必须手动创建所有层的对象 → 「自己管理依赖」&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserController&lt;span style="color:#bbb"&gt; &lt;/span&gt;controller&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#a2f;font-weight:bold"&gt;new&lt;/span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;UserController();&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#080;font-style:italic"&gt;// 调用注册接口&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;controller.&lt;span style="color:#b44"&gt;handleRegisterRequest&lt;/span&gt;(&lt;span style="color:#b44"&gt;&amp;#34;张三&amp;#34;&lt;/span&gt;,&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#b44"&gt;&amp;#34;123456&amp;#34;&lt;/span&gt;);&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt;&lt;/span&gt;}&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有点儿偏面向过程的开发思路，需要自己管理各层依赖对象的创建初始化 ：&lt;/p&gt;</description></item></channel></rss>