Java Maven 結(jié)合Spring 3 種框架設(shè)計(jì)架構(gòu)詳解
核心總覽
Maven 負(fù)責(zé)依賴管理、項(xiàng)目構(gòu)建、模塊化拆分,Spring(Boot)負(fù)責(zé)業(yè)務(wù)開發(fā),二者結(jié)合的架構(gòu)分為:
- 單模塊 Spring Boot 架構(gòu)(新手 / 小項(xiàng)目)
- 多模塊 單體 Spring Boot 架構(gòu)(中大型復(fù)雜后臺(tái),企業(yè)最常用)
- 微服務(wù) Spring Cloud 架構(gòu)(超大型分布式系統(tǒng))
一、單模塊 Spring Boot 架構(gòu)
1. 結(jié)構(gòu)(Maven + Spring)
spring-boot-demo (1個(gè)Maven模塊)
├── pom.xml (僅1個(gè)配置文件)
└── src
└── 所有代碼(controller/service/dao) 都在這- Maven:?jiǎn)雾?xiàng)目、單
pom.xml,僅管理基礎(chǔ)依賴 - Spring:?jiǎn)蝹€(gè) Spring Boot 應(yīng)用,一個(gè)啟動(dòng)類,一個(gè)打包文件
2. 核心特點(diǎn)
最簡(jiǎn)單的架構(gòu),所有代碼放在一個(gè)模塊里,不分層、不拆分,開箱即用。
3. 優(yōu)點(diǎn)
? 上手極快,零基礎(chǔ)可學(xué)? 開發(fā)效率最高,無需配置模塊化? Maven 打包 / 運(yùn)行最簡(jiǎn)單? 部署簡(jiǎn)單(直接運(yùn)行一個(gè) jar 包)
4. 缺點(diǎn)
? 項(xiàng)目變大后代碼臃腫、混亂? 代碼復(fù)用性差? 不適合多人協(xié)作開發(fā)? 無法拆分業(yè)務(wù)模塊
5. 適用場(chǎng)景
- 學(xué)習(xí)練習(xí)、畢業(yè)設(shè)計(jì)
- 小型后臺(tái)、簡(jiǎn)單管理系統(tǒng)
- 快速原型開發(fā)
二、多模塊 單體 Spring Boot 架構(gòu)(?? 企業(yè)首選)
1. 結(jié)構(gòu)(Maven 父子工程 + 單 Spring Boot 應(yīng)用)
project-parent (Maven父工程,無代碼,僅管理版本) ├── pom.xml ├── common (公共模塊:工具類、常量) ├── dao (數(shù)據(jù)訪問模塊:Mapper、實(shí)體) ├── service (業(yè)務(wù)模塊:Service) └── web (Web模塊:Controller、啟動(dòng)類)
- Maven:父子模塊架構(gòu),父
pom統(tǒng)一管理所有依賴版本,子模塊互相依賴 - Spring:依然是一個(gè) Spring Boot 項(xiàng)目(最終打包成一個(gè) jar),只是代碼拆分到多個(gè) Maven 模塊
2. 核心特點(diǎn)
- 還是單體應(yīng)用(不拆分服務(wù))
- 僅通過 Maven 拆分代碼模塊,實(shí)現(xiàn)業(yè)務(wù)解耦、代碼復(fù)用
- 啟動(dòng)、部署和單模塊完全一樣
3. 優(yōu)點(diǎn)
? 適合中大型復(fù)雜后臺(tái)系統(tǒng)(你問的復(fù)雜系統(tǒng)首選)? 代碼分層解耦,結(jié)構(gòu)清晰,易維護(hù)? Maven 統(tǒng)一管理依賴,無版本沖突? 代碼復(fù)用性高(公共模塊抽離)? 多人協(xié)作開發(fā)無沖突? 部署簡(jiǎn)單(還是一個(gè) jar 包)
4. 缺點(diǎn)
? 比單模塊稍復(fù)雜,需要學(xué)習(xí) Maven 父子工程? 本質(zhì)還是單體,無法獨(dú)立擴(kuò)容、獨(dú)立部署
5. 適用場(chǎng)景
? 90% 企業(yè)級(jí)復(fù)雜后臺(tái)(OA、CRM、電商管理后臺(tái)、中臺(tái)系統(tǒng))? 多人團(tuán)隊(duì)開發(fā)? 業(yè)務(wù)復(fù)雜,但不需要分布式
三、微服務(wù) Spring Cloud 架構(gòu)
1. 結(jié)構(gòu)(Maven 父子工程 + 多個(gè) Spring Boot 服務(wù))
cloud-parent (Maven父工程) ├── pom.xml ├── user-service (用戶服務(wù):獨(dú)立SpringBoot) ├── order-service (訂單服務(wù):獨(dú)立SpringBoot) ├── product-service (商品服務(wù):獨(dú)立SpringBoot) └── gateway (網(wǎng)關(guān)服務(wù))
- Maven:父子工程統(tǒng)一版本,每個(gè)服務(wù)是獨(dú)立的 Maven 模塊
- Spring:多個(gè)獨(dú)立的 Spring Boot 應(yīng)用,通過 Spring Cloud 遠(yuǎn)程調(diào)用
2. 核心特點(diǎn)
- 按業(yè)務(wù)拆分成獨(dú)立服務(wù)
- 每個(gè)服務(wù)獨(dú)立開發(fā)、獨(dú)立部署、獨(dú)立擴(kuò)容
- 分布式架構(gòu)
3. 優(yōu)點(diǎn)
? 高并發(fā)、高可用、故障隔離(一個(gè)服務(wù)掛了不影響全局)? 支持億級(jí)用戶、大型分布式系統(tǒng)? 團(tuán)隊(duì)并行開發(fā),每個(gè)團(tuán)隊(duì)負(fù)責(zé)一個(gè)服務(wù)? 靈活擴(kuò)容(訂單壓力大,只擴(kuò)容訂單服務(wù))
4. 缺點(diǎn)
? 架構(gòu)極復(fù)雜,學(xué)習(xí)成本高? 運(yùn)維難度大(需要服務(wù)器、中間件)? 出現(xiàn)分布式問題(事務(wù)、鏈路追蹤)? 新手很難上手
5. 適用場(chǎng)景
? 超大型互聯(lián)網(wǎng)項(xiàng)目(淘寶、京東、抖音后臺(tái))? 高并發(fā)、分布式、多團(tuán)隊(duì)協(xié)作
四、補(bǔ)充:過時(shí)架構(gòu)(原生 Spring + Maven)
結(jié)構(gòu)
無 Spring Boot,純 Spring + Spring MVC + Maven,手動(dòng)寫 XML 配置
特點(diǎn)
配置繁瑣、部署麻煩、開發(fā)效率低
現(xiàn)狀
企業(yè)已完全淘汰,僅用于學(xué)習(xí)底層原理
五、三種架構(gòu) 終極對(duì)比表
表格
| 架構(gòu) | Maven 形態(tài) | Spring 形態(tài) | 優(yōu)點(diǎn) | 缺點(diǎn) | 適用項(xiàng)目 |
|---|---|---|---|---|---|
| 單模塊 | 單模塊 | 單個(gè) SpringBoot | 最簡(jiǎn)單、最快 | 代碼亂、難維護(hù) | 小項(xiàng)目 / 學(xué)習(xí) |
| 多模塊單體 | 父子工程 | 單個(gè) SpringBoot | 解耦、易維護(hù)、企業(yè)標(biāo)準(zhǔn) | 稍復(fù)雜、無法擴(kuò)容 | 復(fù)雜后臺(tái)(首選) |
| 微服務(wù) | 父子工程 | 多個(gè) SpringBoot | 高可用、分布式 | 極復(fù)雜、運(yùn)維難 | 超大型互聯(lián)網(wǎng)項(xiàng)目 |
六、創(chuàng)建多模塊醒目流程
1.命令(同單模塊)
mvn archetype:generate -DgroupId=com.mymulti -DartifactId=spring-boot-mymulti -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2.清理父工程(關(guān)鍵)
- 進(jìn)入文件夾:
cd spring-boot-mymulti - 直接刪除
src文件夾(父工程不需要代碼,只需要pom.xml)
3.替換pom文件
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- SpringBoot 父依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/>
</parent>
<groupId>com.mymulti</groupId>
<artifactId>spring-boot-mymulti</artifactId>
<version>1.0.0</version>
<!-- ? 父工程必須是 pom 打包 -->
<packaging>pom</packaging>
<!-- 子模塊列表(創(chuàng)建子模塊后自動(dòng)生成) -->
<modules>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
</project>4.創(chuàng)建子模塊
在 spring-boot-multi 目錄下,依次執(zhí)行:
# common模塊 mvn archetype:generate -DgroupId=com.multi -DartifactId=common -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false # dao模塊 mvn archetype:generate -DgroupId=com.multi -DartifactId=dao -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false # service模塊 mvn archetype:generate -DgroupId=com.multi -DartifactId=service -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false # web模塊 mvn archetype:generate -DgroupId=com.multi -DartifactId=web -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
5.添加模塊間依賴
web 模塊 → 依賴 service,mservice 模塊 → 依賴 dao,dao 模塊 → 依賴 common,common 模塊 → 無業(yè)務(wù)依賴(公共工具)
dao模塊中的pom添加 common依賴

service模塊的pom添加 dao依賴

6.配置web模塊(啟動(dòng)入口)
添加 web 依賴 + 打包插件
web目錄下的pom 增加:
<!-- 核心依賴 -->
<dependencies>
<!-- 依賴業(yè)務(wù)層 service -->
<dependency>
<groupId>com.mymulti</groupId>
<artifactId>service</artifactId>
<version>1.0.0</version>
</dependency>
<!-- SpringBoot Web 核心(接口、服務(wù)器) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- SpringBoot 打包插件(唯一啟動(dòng)模塊需要) -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>編譯: mvn clean install -U
啟動(dòng):mvn spring-boot:run
七.定義路由與訪問接口
1. web 模塊 → 定義 路由 + 接口(唯一入口)
com.mymulti.controller.UserController
package com.mymulti.controller;
import com.mymulti.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// 統(tǒng)一路由前綴 /user
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 路由:/user/get/1
@GetMapping("/get/{id}")
public Object getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}2. service 模塊 → 處理業(yè)務(wù)
package com.mymulti.service;
import com.mymulti.dao.UserMapper;
import com.mymulti.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}3. dao 模塊 → 操作數(shù)據(jù)庫
package com.mymulti.dao;
import com.mymulti.entity.User;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from user where id=#{id}")
User selectById(Long id);
}4. common 模塊 → 公共實(shí)體
package com.mymulti.entity;
public class User {
private Long id;
private String username;
// getter/setter
}八.相關(guān)問題
1.模塊間在pom里面聲明依賴有什么作用
模塊間在pom.xml聲明依賴 =告訴 Maven:我這個(gè)模塊,要使用另一個(gè)模塊的代碼!
如果不聲明,你根本調(diào)用不了其他模塊的類,編譯直接報(bào)錯(cuò)!
舉例:
common中定義的類:common/src/main/java/com/mymulti/entity/User.java
package com.mymulti.entity;
/**
* 公共實(shí)體類(放在 common 模塊,所有模塊都能用)
* 對(duì)應(yīng)數(shù)據(jù)庫 user 表
*/
public class User {
private Long id;
private String username;
private String password;
// getter/setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}dao中調(diào)用
dao/src/main/java/com/mymulti/mapper/UserMapper.java
package com.mymulti.mapper;
import com.mymulti.entity.User; // 直接導(dǎo)入 common 模塊的類
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* DAO 層:數(shù)據(jù)庫操作
* 直接使用了 common 中的 User 實(shí)體類
*/
public interface UserMapper {
// 查詢所有用戶 → 返回的是 common 里的 User 對(duì)象
@Select("select id, username, password from user")
List<User> findAll();
// 根據(jù)ID查詢用戶
@Select("select * from user where id = #{id}")
User findById(Long id);
}2.除了在web模塊定義路由與訪問接口 其他模塊可以自己定義嗎
service / dao / 任意模塊,都能寫 @RestController、寫路由接口,能正常訪問。
全局掃描所有模塊只要滿足 2 個(gè)條件,非 web 模塊也能寫接口:
- 該模塊間接 / 直接包含
spring-web依賴(你的項(xiàng)目里都傳遞進(jìn)來了) - 類上打
@RestController/@Controller
到此這篇關(guān)于Java Maven 結(jié)合Spring 3 種框架設(shè)計(jì)架構(gòu)詳解的文章就介紹到這了,更多相關(guān)java maven spring內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaSpring?boot配置JDK和MAVEN開發(fā)環(huán)境詳解
- IDEA實(shí)現(xiàn)純java項(xiàng)目并打包jar的步驟(不使用Maven,Spring)
- 解析JAVA中 maven pom.xml 和 properties 配置文件、spring 配置文件及環(huán)境變量的關(guān)系
- spring-boot-maven-plugin插件打包和java -jar命令執(zhí)行原理分析
- Java?Spring?boot?配置JDK和MAVEN開發(fā)環(huán)境的過程
- SpringBoot Maven打包失敗報(bào):class lombok.javac.apt.LombokProcessor錯(cuò)誤的解決辦法
- Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(圖文)
相關(guān)文章
springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能
這篇文章主要為大家介紹了springboot?vue項(xiàng)目管理前后端實(shí)現(xiàn)編輯功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java Idea TranslationPlugin翻譯插件使用解析
這篇文章主要介紹了Java Idea TranslationPlugin翻譯插件使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Spring?Boot對(duì)接Oracle數(shù)據(jù)庫具體流程
Java 反射獲取類詳細(xì)信息的常用方法總結(jié)

