Spring boot常見的文件結構:
src/
├── main/
│ ├── java/
│ │ └── com.example.demo/
│ │ ├── DemoApplication.java # 主入口
│ │ ├── config/ # 配置類
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 業務邏輯
│ │ ├── mapper/ # 數據庫操作接口
│ │ ├── entity/ # 數據庫實體類
│ │ ├── dto/ # 數據傳輸對象
│ │ ├── listener/ # 監聽器
│ │ └── interceptor/ # 攔截器
│ └── resources/
│ ├── application.yml # 全局配置
│ └── mapper/ # MyBatis 的 XML 文件
└── test/ # 測試代碼
1. config
(配置文件夾)
- 作用:像「工具箱的說明書」,存放各種配置類。
- 常見內容:
- 數據庫連接配置
- 第三方工具(如Redis、Swagger)的配置
- 自定義規則(比如日期格式、安全規則)
- 示例:
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate() {// 配置 Redis 連接return new RedisTemplate<>();} }
2. mapper
(數據映射文件夾)
- 作用:像「翻譯官」,負責將 Java 對象和數據庫表互相轉換。
- 常見技術:MyBatis 或 JPA 的數據庫操作接口。
- 示例:
@Mapper // 告訴 MyBatis:這是操作數據庫的接口 public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(int id); }
3. listener
(監聽器文件夾)
- 作用:像「耳朵」,監聽應用中的事件(比如應用啟動、關閉)。
- 常見用途:
- 應用啟動時初始化數據
- 統計在線人數
- 示例:
@Component public class MyListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("應用啟動了!");} }
4. entity
(實體文件夾)
- 作用:像「數據庫的鏡子」,直接對應數據庫表的字段。
- 特點:純數據類,通常和數據庫表一一對應。
- 示例:
@Data // Lombok 自動生成 getter/setter public class User {private Long id;private String name;private Integer age; }
5. dto
(數據傳輸對象文件夾)
- 作用:像「快遞盒」,專門用于在不同層之間傳遞數據。
- 場景:比如前端需要的字段和數據庫實體不同,可以用 DTO 轉換。
- 示例:
@Data public class UserDTO {private String username;private String email; // 數據庫實體沒有 email 字段,但前端需要 }
6. interceptor
(攔截器文件夾)
- 作用:像「安檢員」,在請求到達 Controller 前/后做檢查或處理。
- 常見用途:
- 登錄驗證(檢查是否有 Token)
- 記錄請求日志
- 示例:
public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 檢查用戶是否登錄return true; // 放行請求} }
7.bean 文件夾(或包)
作用:像「零件倉庫」,存放被 Spring 管理的對象(Bean)的定義,尤其是那些不屬于傳統分層(如 Controller/Service)的組件。
常見內容:
自定義配置類(比如第三方工具需要的 Bean)
工具類 Bean(比如日期轉換器、加密工具)
全局共享的組件(比如自定義異常處理器)
示例:
// 假設在 bean 包下定義一個加密工具 Bean
@Component // 標記為 Bean
public class EncryptUtils {public String encrypt(String data) {// 實現加密邏輯return "加密后的數據";}
}
8.common 文件夾(或包)
作用:像「公共工具箱」,存放全項目通用的代碼,不依賴具體業務邏輯。
常見內容:
工具類(如日期處理、字符串處理)
常量類(如錯誤碼、固定配置)
自定義異常類(如 BusinessException)
通用返回對象(如統一格式的 API 響應類)
公共配置(如全局異常處理器)
示例:
// 在 common 包下定義一個統一響應格式
@Data
public class ApiResponse<T> {private int code;private String message;private T data;public static <T> ApiResponse<T> success(T data) {ApiResponse<T> response = new ApiResponse<>();response.setCode(200);response.setMessage("成功");response.setData(data);return response;}
}
對比其他文件夾
文件夾 類比 核心區別
bean 特殊零件庫 存放非分層專用的 Spring Bean
common 共享工具箱 存放與業務無關的通用代碼
config 說明書 專門配置 Bean 和第三方工具
其他核心文件夾回顧
文件夾 | 作用比喻 | 示例內容 |
---|---|---|
controller | 服務員(處理 HTTP 請求) | UserController |
service | 廚師(處理業務邏輯) | UserService |
repository | 倉庫管理員(操作數據庫) | UserRepository |
主入口(Main) | 大門(啟動程序) | SpringApplication.run() |
為什么需要這么多文件夾?
- 職責分離:就像餐廳分工(廚師、服務員、采購員),不同代碼做不同事。
- 易于維護:修改數據庫操作不用動業務邏輯代碼。
- 團隊協作:后端開發可以專注
service
,前端聯調看dto
。
總結一句話
entity
:直接對應數據庫表dto
:給前端看的“包裝版”數據mapper
:操作數據庫的接口config
:配置第三方工具interceptor
:攔截請求做檢查listener
:監聽應用生命周期事件