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
:监听应用生命周期事件