<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>设计模式 on 蛋蛋忧桑</title><link>https://dandansad.com/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link><description>Recent content in 设计模式 on 蛋蛋忧桑</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 30 Jun 2025 00:38:11 +0800</lastBuildDate><atom:link href="https://dandansad.com/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>【软件架构设计模式】MVC、MVP、MVVM辨析</title><link>https://dandansad.com/2025/06/30/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8Fmvcmvpmvvm%E8%BE%A8%E6%9E%90/</link><pubDate>Mon, 30 Jun 2025 00:38:11 +0800</pubDate><guid>https://dandansad.com/2025/06/30/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8Fmvcmvpmvvm%E8%BE%A8%E6%9E%90/</guid><description>&lt;p&gt;在学习编码的过程中，我们最常听到 Spring MVC 中的 MVC ，与 Vue 中的 MVVM 。他们实际上都是“架构设计模式”中的一种设计思路，并不专属于前端或后端，任何地方只要涉及“界面 + 业务逻辑 + 数据”，理论上都能用这些设计思想来组织代码。接下来，我们按照架构演进的顺序来分别介绍三种设计模式。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="../../images/2025/06/0f5d56e8e0514dfb9486412feeb62093-1024x538.png"&gt;&lt;/p&gt;
&lt;h2 id="mvcmodel-view-controller"&gt;&lt;a href="#mvcmodel-view-controller" class="header-anchor"&gt;&lt;/a&gt;MVC（Model-View-Controller）
&lt;/h2&gt;&lt;h3 id="-定义"&gt;&lt;a href="#-%e5%ae%9a%e4%b9%89" class="header-anchor"&gt;&lt;/a&gt;👉 定义：
&lt;/h3&gt;&lt;p&gt;一种将数据、界面和控制逻辑分离的架构模式。&lt;/p&gt;
&lt;h3 id="-组成与职责"&gt;&lt;a href="#-%e7%bb%84%e6%88%90%e4%b8%8e%e8%81%8c%e8%b4%a3" class="header-anchor"&gt;&lt;/a&gt;📦 组成与职责：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt;：负责业务逻辑和数据（如数据库、对象、状态管理等）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt;：展示数据，负责界面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controller&lt;/strong&gt;：接收用户输入，调用 Model 改变数据，并刷新 View。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-特点"&gt;&lt;a href="#-%e7%89%b9%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;📌 特点：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Controller 是中介，负责流程控制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View 和 Controller 有一定耦合。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View 可以从 Model 中主动获取数据（松耦合）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-缺点"&gt;&lt;a href="#-%e7%bc%ba%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;📉 &lt;strong&gt;缺点&lt;/strong&gt;：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在用户交互复杂、状态多的系统中，&lt;strong&gt;Controller 越来越臃肿&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View 可能直接访问 Model，耦合变高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不方便单元测试。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-应用场景"&gt;&lt;a href="#-%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;📍 应用场景：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;后端 Web 框架（如：Spring MVC、Django、Rails）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;早期前端框架（如：Backbone.js）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mvpmodel-view-presenter"&gt;&lt;a href="#mvpmodel-view-presenter" class="header-anchor"&gt;&lt;/a&gt;MVP（Model-View-Presenter）
&lt;/h2&gt;&lt;h3 id="-定义-1"&gt;&lt;a href="#-%e5%ae%9a%e4%b9%89-1" class="header-anchor"&gt;&lt;/a&gt;👉 定义：
&lt;/h3&gt;&lt;p&gt;从 MVC 演化而来的架构，强调 Presenter 统一控制逻辑。&lt;/p&gt;
&lt;h3 id="-组成与职责-1"&gt;&lt;a href="#-%e7%bb%84%e6%88%90%e4%b8%8e%e8%81%8c%e8%b4%a3-1" class="header-anchor"&gt;&lt;/a&gt;📦 组成与职责：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt;：业务逻辑与数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt;：UI 展示，通常是接口，由具体界面实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Presenter&lt;/strong&gt;：中间人，接收 View 的操作，调用 Model，更新 View。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-特点-1"&gt;&lt;a href="#-%e7%89%b9%e7%82%b9-1" class="header-anchor"&gt;&lt;/a&gt;📌 特点：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;View 是被动的&lt;/strong&gt;，通过接口由 Presenter 调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Presenter 和 View 通过接口解耦，方便单元测试。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View 不直接访问 Model，逻辑统一在 Presenter。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-缺点-1"&gt;&lt;a href="#-%e7%bc%ba%e7%82%b9-1" class="header-anchor"&gt;&lt;/a&gt;📉 &lt;strong&gt;缺点&lt;/strong&gt;：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;手动更新 View 繁琐&lt;/strong&gt;，重复代码多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Presenter 成为“巨无霸类”，职责过重。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-应用场景-1"&gt;&lt;a href="#-%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af-1" class="header-anchor"&gt;&lt;/a&gt;📍 应用场景：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Android 原生开发（Activity/View 层解耦）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UI 逻辑复杂，适合测试的应用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mvvmmodel-view-viewmodel"&gt;&lt;a href="#mvvmmodel-view-viewmodel" class="header-anchor"&gt;&lt;/a&gt;MVVM（Model-View-ViewModel）
&lt;/h2&gt;&lt;h3 id="-定义-2"&gt;&lt;a href="#-%e5%ae%9a%e4%b9%89-2" class="header-anchor"&gt;&lt;/a&gt;👉 定义：
&lt;/h3&gt;&lt;p&gt;适合现代前端框架的一种架构，强调 &lt;strong&gt;双向数据绑定&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="-组成与职责-2"&gt;&lt;a href="#-%e7%bb%84%e6%88%90%e4%b8%8e%e8%81%8c%e8%b4%a3-2" class="header-anchor"&gt;&lt;/a&gt;📦 组成与职责：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt;：业务数据和逻辑。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt;：界面，HTML/CSS。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ViewModel&lt;/strong&gt;：桥梁，处理数据到视图的逻辑，支持双向绑定。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-特点-2"&gt;&lt;a href="#-%e7%89%b9%e7%82%b9-2" class="header-anchor"&gt;&lt;/a&gt;📌 特点：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;View 和 ViewModel 双向绑定，自动同步状态变化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ViewModel 不依赖 View（理想上），可测试。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开发效率高，但难以完全控制数据流。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-缺点-2"&gt;&lt;a href="#-%e7%bc%ba%e7%82%b9-2" class="header-anchor"&gt;&lt;/a&gt;📉 &lt;strong&gt;缺点&lt;/strong&gt;：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;数据绑定框架复杂，调试较难。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大型项目中，ViewModel 仍可能变复杂。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对初学者不透明（UI 怎么突然就变了？）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-应用场景-2"&gt;&lt;a href="#-%e5%ba%94%e7%94%a8%e5%9c%ba%e6%99%af-2" class="header-anchor"&gt;&lt;/a&gt;📍 应用场景：
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;现代前端框架：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vue.js（典型 MVVM）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Angular（近似 MVVM）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;React + 状态管理库（Redux/MobX）部分采用 MVVM 思想&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;关键差异&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;MVC&lt;/td&gt;
					&lt;td&gt;Controller 控制流程，View 可以访问 Model。控制逻辑分散。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MVP&lt;/td&gt;
					&lt;td&gt;Presenter 完全掌控，View 是被动的。依赖方向是 Presenter 调 View。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MVVM&lt;/td&gt;
					&lt;td&gt;自动绑定，ViewModel 不直接调用 View，UI 自动响应数据变化。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;MVC&lt;/th&gt;
					&lt;th&gt;MVP&lt;/th&gt;
					&lt;th&gt;MVVM&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;中间控制者&lt;/td&gt;
					&lt;td&gt;Controller&lt;/td&gt;
					&lt;td&gt;Presenter&lt;/td&gt;
					&lt;td&gt;ViewModel&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;View ↔ 中间层&lt;/td&gt;
					&lt;td&gt;Controller 控制 View，有时 View 拉数据&lt;/td&gt;
					&lt;td&gt;View 调用 Presenter，Presenter 调用 View&lt;/td&gt;
					&lt;td&gt;View 和 ViewModel 双向绑定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;View 是否主动&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
					&lt;td&gt;否，View 被 Presenter 调用&lt;/td&gt;
					&lt;td&gt;否，由绑定驱动&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;View 是否访问 Model&lt;/td&gt;
					&lt;td&gt;有可能&lt;/td&gt;
					&lt;td&gt;否&lt;/td&gt;
					&lt;td&gt;否（通过 ViewModel）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据更新方式&lt;/td&gt;
					&lt;td&gt;手动&lt;/td&gt;
					&lt;td&gt;手动&lt;/td&gt;
					&lt;td&gt;自动（数据绑定）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;是否适合自动化测试&lt;/td&gt;
					&lt;td&gt;一般&lt;/td&gt;
					&lt;td&gt;强（Presenter 可隔离测试）&lt;/td&gt;
					&lt;td&gt;一般（数据绑定不易测试）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;常见技术/场景&lt;/td&gt;
					&lt;td&gt;Spring MVC、Django&lt;/td&gt;
					&lt;td&gt;Android Java/Kotlin&lt;/td&gt;
					&lt;td&gt;Vue、Angular、React（类似）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;MVC 是经典三层分离，MVP 强调 Presenter 驱动逻辑，MVVM 让视图与数据自动同步，是现代前端主流。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MVC 中，View 可以主动从 Model 获取数据；MVP 中，View 只能被动等待 Presenter 推送数据；而 MVVM 中，View 与 ViewModel 通过数据绑定自动同步，既不主动也不被动，由状态驱动界面更新。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spring Boot 后端还是 MVC，Vue/React 属于 MVVM 思想，而 Android 多用 MVP。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="spring中的mvc"&gt;&lt;a href="#spring%e4%b8%ad%e7%9a%84mvc" class="header-anchor"&gt;&lt;/a&gt;Spring中的MVC
&lt;/h2&gt;&lt;h3 id="传统-springmvc-项目"&gt;&lt;a href="#%e4%bc%a0%e7%bb%9f-springmvc-%e9%a1%b9%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;传统 SpringMVC 项目
&lt;/h3&gt;&lt;p&gt;👉 模式：&lt;strong&gt;经典 MVC 架构&lt;/strong&gt;，后端控制全部流程，包括页面渲染。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;MVC 角色&lt;/th&gt;
					&lt;th&gt;Spring 中的对应&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Model&lt;/td&gt;
					&lt;td&gt;Java 实体类、Service、DAO，负责数据和业务逻辑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;View&lt;/td&gt;
					&lt;td&gt;JSP、Thymeleaf 等模板文件，由后端渲染返回给浏览器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Controller&lt;/td&gt;
					&lt;td&gt;@Controller 注解的类，接收请求，调业务逻辑，返回视图&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Controller&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserController&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@GetMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/user&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String &lt;span style="color:#a6e22e"&gt;getUser&lt;/span&gt;(Model model) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; User user &lt;span style="color:#f92672"&gt;=&lt;/span&gt; userService.&lt;span style="color:#a6e22e"&gt;getUser&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model.&lt;span style="color:#a6e22e"&gt;addAttribute&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;, user);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;userPage&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 返回视图名，去找 userPage.html/jsp 渲染&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="前后端分离的-spring-boot-项目"&gt;&lt;a href="#%e5%89%8d%e5%90%8e%e7%ab%af%e5%88%86%e7%a6%bb%e7%9a%84-spring-boot-%e9%a1%b9%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;前后端分离的 Spring Boot 项目
&lt;/h3&gt;&lt;p&gt;👉 模式：&lt;strong&gt;后端依然是 MVC，但只负责提供数据，View 被剥离到前端框架（Vue/React）中处理&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;MVC 角色&lt;/th&gt;
					&lt;th&gt;Spring Boot（后端） 中的对应&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Model&lt;/td&gt;
					&lt;td&gt;仍然是实体类、Service、Repository 层&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;View&lt;/td&gt;
					&lt;td&gt;❌ 被前端（Vue、React）取代，后端没有视图层&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Controller&lt;/td&gt;
					&lt;td&gt;@RestController 提供 RESTful API，返回 JSON，不再返回页面&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@RestController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserController&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@GetMapping&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/api/user&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; User &lt;span style="color:#a6e22e"&gt;getUser&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; userService.&lt;span style="color:#a6e22e"&gt;getUser&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>