深入解析Spring Boot項目目錄結構:從新手到規范實踐

一、標準項目結構全景圖

典型的Spring Boot項目(Maven構建)目錄結構如下:

my-spring-project/
├── src/
│   ├── main/
│   │   ├── java/              # 核心代碼
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── myapp/
│   │   ├── resources/         # 資源配置
│   │   │   ├── static/        # 靜態資源
│   │   │   ├── templates/     # 模板文件
│   │   │   └── application.yml # 主配置
│   │   └── webapp/            # Web資源(可選)
│   └── test/                  # 測試代碼
├── target/                    # 構建輸出
├── pom.xml                    # Maven配置
└── .gitignore                 # 版本控制排除
二、核心代碼分層架構
  1. 控制器層(Controller)

    • 路徑示例:com.example.myapp.controller
    • 職責:處理HTTP請求,參數校驗,響應返回
    • 最佳實踐:保持簡潔,避免業務邏輯
    @RestController
    @RequestMapping("/api/users")
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {return ResponseEntity.ok(userService.getUserById(id));}
    }
    
  2. 服務層(Service)

    • 路徑:com.example.myapp.service
    • 核心業務邏輯實現
    • 接口與實現分離模式:
    public interface UserService {UserDTO getUserById(Long id);
    }@Service
    public class UserServiceImpl implements UserService {// 業務邏輯實現
    }
    
  3. 持久層(Repository)

    • 路徑:com.example.myapp.repository
    • 數據庫交互抽象層
    • Spring Data JPA示例:
    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByEmail(String email);
    }
    
  4. 領域模型(Model)

    • 路徑:com.example.myapp.model
    • 包含:實體類(Entity)、DTO、VO等
    • 實體類示例:
    @Entity
    @Table(name = "users")
    public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;// 其他字段及關聯關系
    }
    
三、資源文件深度解析
  1. 應用配置

    • application.yml優先級高于.properties
    • 多環境配置方案:
    application-dev.yml
    application-prod.yml
    
    • 自定義配置項管理:
    app:security:jwt-secret: "mySecretKey"token-expiration: 86400
    
  2. 靜態資源管理

    • /static目錄存放:
    • CSS/JS文件
    • 圖片資源
    • 圖標文件(favicon.ico)
    • 訪問路徑:http://localhost:8080/static/style.css
  3. 模板引擎集成

    • Thymeleaf模板存放路徑:/templates
    • 安全渲染示例:
    <div th:text="${#strings.escapeXml(user.name)}"></div>
    
四、測試體系架構
  1. 單元測試層

    • 路徑:src/test/java
    • 分層對應測試:
    • Controller → @WebMvcTest
    • Service → @MockBean
    • Repository → @DataJpaTest
  2. 集成測試策略

    • 完整應用啟動測試:
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    public class IntegrationTest {@LocalServerPortprivate int port;@Testpublic void testApiEndpoint() {// 使用TestRestTemplate發起請求}
    }
    
五、進階結構設計
  1. 自定義包結構方案

    com.example.myapp
    ├── config/        // 配置類集中管理
    ├── exception/     // 自定義異常處理
    ├── aspect/        // AOP切面編程
    ├── utils/         // 工具類集合
    └── security/      // 安全相關組件
    
  2. 多模塊項目結構

    parent-project/
    ├── common-module/    // 通用工具
    ├── domain-module/    // 領域模型
    ├── service-module/   // 業務邏輯
    └── web-module/       // Web接口
    
  3. 配置類最佳實踐

    @Configuration
    @EnableAsync
    @EnableScheduling
    public class AppConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
    }
    
六、構建文件解析

Maven核心配置項:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 開發環境專用依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins>
</build>
七、常見問題解決方案
  1. 包掃描失效處理

    • 確保主類位于根包路徑
    • 顯式指定掃描路徑:
    @SpringBootApplication(scanBasePackages = "com.example")
    
  2. 配置加載優先級

    1. 命令行參數
    2. JNDI屬性
    3. 應用外部配置文件
    4. 打包內部的配置文件
    5. @Configuration類上的@PropertySource
  3. 多環境構建策略

    mvn clean package -Pprod
    

    對應pom配置:

    <profiles><profile><id>prod</id><properties><activatedProperties>prod</activatedProperties></properties></profile>
    </profiles>
    
結語

規范的目錄結構是項目可維護性的基石。建議根據團隊規模制定適當的規范:小型項目可采用標準結構,中大型項目推薦模塊化設計。關鍵是要保持一致性,并通過持續集成確保結構規范得以貫徹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80882.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言】宏經典練習題,交換奇偶位

交換奇偶位 寫一個宏&#xff0c;可以將一個整數的二進制位的奇數位和偶數位交換。 #define Swap(x) x(((x&0x55555555)<<1)((x&0xaaaaaaaa)>>1)) int main() {int a 10;Swap(a);printf("%d\n", a);return 0; } 寫宏的思路&#xff1a; 假設…

VSCode-插件:codegeex:ai coding assistant / 清華智普 AI 插件

一、官網 https://codegeex.cn/ 二、vscode 安裝插件 點擊安裝即可&#xff0c;無需復雜操作&#xff0c;國內軟件&#xff0c;無需科學上網&#xff0c;非常友好 三、智能注釋 輸入 // 或者 空格---后邊自動出現注釋信息&#xff0c;&#xff0c;按下 Tab 鍵&#xff0c;進…

FFmpeg 與 C++ 構建音視頻處理全鏈路實戰(三)—— FFmpeg 內存模型

經過前面文章的 FFmpeg 編程實踐&#xff0c;相信你已經對AVPacket和AVFrame這兩個核心結構體不再陌生。當我們編寫代碼時&#xff0c;頻繁調用unref系列 API 釋放內存的操作&#xff0c;或許讓你心生疑惑&#xff1a;這些函數究竟是如何實現內存釋放的&#xff1f;又該在何時準…

c 中的哈希表

哈希是一種可以接受各種類型、大小的輸入&#xff0c;輸出一個固定長度整數的過程。你可以將哈希理解成一種特殊的映射&#xff0c;哈希映射&#xff0c;將一個理論無限的集合A映射到有限整數集合B上。 哈希函數&#xff1a;哈希函數是哈希過程的核心&#xff0c;它決定了哈希映…

【一次成功!】Ubuntu22.04安裝cartographer

之前在ubuntu20.04上成功安裝cartographer&#xff0c;但是翻遍全網都沒找到官方的22.04安裝教程&#xff0c;然后找到小魚的&#xff0c;試了一下&#xff0c;一次成功&#xff0c;連接如下&#xff1a; gd2l-ros2/docs/humble/chapt10/get_started/2.Carto介紹及安裝.md at …

【WPF】Opacity 屬性的使用

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Opacity 屬性是定義一個元素透明度的屬性&#xff0c;其值范圍是從 0.0&#xff08;完全透明&#xff09;到 1.0&#xff08;完全不透明&#xff09;。由于 Opacity 是在 UIElement 類中定義的&…

8天Python從入門到精通【itheima】-6~10

目錄 7節-開發出第一個Python程序: 1.在cmd窗口寫下第一個最簡單的程序:Hello World!!! 9節: 1.如何卸載python: 2.報錯:不是可運行的程序 ?編輯 3.報錯:無法初始化設備PRN: 4.報錯:語法錯誤——非法的字符 10節-python解釋器: 1.python解釋器的原理: 2.解…

Mac 3大好用的復制粘貼管理工具對比

剪貼板管理器是查看復制粘貼歷史記錄的工具&#xff0c;幾乎是每個蘋果電腦用戶必備工具。市面上的工具很多&#xff0c;我結合了功能豐富、設計簡潔、交互便利整理了目前3款頭部剪貼板應用 Paste、PasteNow、PasteMe。 Paste 優勢&#xff1a;老牌剪切板應用&#xff0c;功能…

2025年全國青少年信息素養大賽初賽模擬測試網站崩了的原因及應對比賽流程

2025年全國青少年信息素養大賽初賽模擬測試昨天開始&#xff0c;由于同一時間涌入太多的人&#xff0c;導致網站的服務器奔了&#xff0c;出現了各種狀況&#xff0c;導致很多人沒有模擬上&#xff0c;大家今天可以刷新或者提前打開網頁。 有的是一直“轉圈圈”&#xff0c;有的…

02 | 大模型微調 | 從0學習到實戰微調 | 從數學概率到千億參數大模型

一、導讀 作為非AI專業技術開發者&#xff08;我是小小爬蟲開發工程師&#x1f60b;&#xff09; 本系列文章將圍繞《大模型微調》進行學習&#xff08;也是我個人學習的筆記&#xff0c;所以會持續更新&#xff09;&#xff0c;最后以上手實操模型微調的目的。 &#xff08;…

十四、繼承與組合(Inheritance Composition)

十四、繼承與組合&#xff08;Inheritance & Composition&#xff09; 引言 C最引人注目的特性之一是代碼復用。組合&#xff1a;在新類中創建已有類的對象。繼承&#xff1a;將新類作為已有類的一個類型來創建。 14.1 組合的語法 Useful.h //C14:Useful.h #ifndef US…

2025年5月-信息系統項目管理師高級-軟考高項一般計算題

決策樹和期望貨幣值 加權算法 自制和外購分析 溝通渠道 三點估算PERT 當其他條件一樣時&#xff0c;npv越大越好

OpenJDK 17 中線程啟動的完整流程用C++ 源碼詳解

1. 線程創建入口&#xff08;JNI 層&#xff09; 當 Java 層調用 Thread.start() 時&#xff0c;JVM 通過 JNI 進入 JVM_StartThread 函數&#xff1a; JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))// 1. 檢查線程狀態&#xff0c;防止重復啟動if (java_…

Spring MVC參數傳遞

本內容采用最新SpringBoot3框架版本,視頻觀看地址:B站視頻播放 1. Postman基礎 Postman是一個接口測試工具,Postman相當于一個客戶端,可以模擬用戶發起的各類HTTP請求,將請求數據發送至服務端,獲取對應的響應結果。 2. Spring MVC相關注解 3. Spring MVC參數傳遞 Spri…

Python面向對象編程(OOP)深度解析:從封裝到繼承的多維度實踐

引言 面向對象編程(Object-Oriented Programming, OOP)是Python開發中的核心范式&#xff0c;其三大特性——??封裝、繼承、多態??——為構建模塊化、可維護的代碼提供了堅實基礎。本文將通過代碼實例與理論結合的方式&#xff0c;系統解析Python OOP的實現機制與高級特性…

0.66kV0.69kV接地電阻柜常規配置單

0.66kV/0.69kV接地電阻柜是變壓器中性點接地電阻柜中的特殊存在&#xff0c;主要應用于低壓柴油發電機組220V、火力發電廠380V、煤炭企業660V/690V等電力系統或電力用戶1000V的低壓系統中。 我們來看看0.66kV0.69kV接地電阻柜配置單&#xff1a; 配置特點如下&#xff1a; 1…

矩陣短劇系統:如何用1個后臺管理100+小程序?深度解析多端綁定技術

短劇行業效率革命&#xff01;一套系統實現多平臺內容分發、數據統管與流量聚合 在短劇行業爆發式增長的今天&#xff0c;內容方和運營者面臨兩大核心痛點&#xff1a;多平臺運營成本高與流量分散難聚合。傳統模式下&#xff0c;每個小程序需獨立開發后臺&#xff0c;導致人力…

CSS可以繼承的樣式匯總

CSS可以繼承的樣式匯總 在CSS中&#xff0c;以下是一些常見的可繼承樣式屬性&#xff1a; 字體屬性&#xff1a;包括 font-family &#xff08;字體系列&#xff09;、 font-size &#xff08;字體大小&#xff09;、 font-weight &#xff08;字體粗細&#xff09;、 font-sty…

BFS算法篇——打開智慧之門,BFS算法在拓撲排序中的詩意探索(上)

文章目錄 引言一、拓撲排序的背景二、BFS算法解決拓撲排序三、應用場景四、代碼實現五、代碼解釋六、總結 引言 在這浩瀚如海的算法世界中&#xff0c;有一扇門&#xff0c;開啟后通向了有序的領域。它便是拓撲排序&#xff0c;這個問題的解決方法猶如一場深刻的哲學思考&#…

【Qt開發】信號與槽

目錄 1&#xff0c;信號與槽的介紹 2&#xff0c;信號與槽的運用 3&#xff0c;自定義信號 1&#xff0c;信號與槽的介紹 在Qt框架中&#xff0c;信號與槽機制是一種用于對象間通信的強大工具。它是在Qt中實現事件處理和回調函數的主要方法。 信號&#xff1a;窗口中&#x…