当前位置: 首页 > news >正文

Spring学习笔记03——Spring Boot的文件结构

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 {
        @Bean
        public 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> {
        @Override
        public 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 {
        @Override
        public 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()

为什么需要这么多文件夹?

  1. 职责分离:就像餐厅分工(厨师、服务员、采购员),不同代码做不同事。
  2. 易于维护:修改数据库操作不用动业务逻辑代码。
  3. 团队协作:后端开发可以专注 service,前端联调看 dto

总结一句话

  • entity:直接对应数据库表
  • dto:给前端看的“包装版”数据
  • mapper:操作数据库的接口
  • config:配置第三方工具
  • interceptor:拦截请求做检查
  • listener:监听应用生命周期事件

相关文章:

  • XGMII(10 Gigabit Media Independent Interface)详解
  • Mac上安装Pycharm
  • 【音视频】音频基础
  • 前端项目打包生成 JS 文件的核心步骤
  • 飞牛NAS玩转DeepSeek-R1大模型并实现内外网自由互通
  • AI浏览器BrowserUse:本机运行环境准备(二)
  • Linux搭建个人大模型RAG-(ollama+deepseek+anythingLLM)
  • java jar包内的jar包如何打补丁
  • 51单片机编程学习笔记——74HC245八路三态输出双向收发器
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token
  • 矩阵压缩存储
  • 大白话TypeScript 第十章TypeScript 学习全阶段详细总结
  • Unity TMP_InputField 多行输入时的高度适应
  • Spring生命周期都有哪些阶段
  • k8s命名空间和资源配额
  • redis 与 DB 的一致性 7 种策略
  • 软考教材重点内容 信息安全工程师 第18章 网络安全测评技术与标准
  • 【C语言】高内聚低耦合:结构体、联合体、数组、字符串、枚举和指针的综合实践
  • 显式 GC 的使用:留与去,如何选择?
  • [RN]React Native知识框架图详解
  • 做调查哪个网站比较可靠/北京网络排名优化
  • 丹东网站建设/深圳百度地图
  • 软件产品如何做网站推广/最新域名8xgmvxyz
  • 什么是手机网站建设/谷歌三件套一键安装
  • 做最好的网站/cms自助建站系统
  • 上海做兼职的网站/郑州网站推广效果