💜 想真正擅长编程? 从一门课程开始,100% 免费

4-2、快速看懂公司项目架构

入职拿到一个几十万行的项目,一脸懵逼不知道从哪看起。这节教你一套方法论,快速搞懂公司项目的结构和脉络。


一、先看文档

别上来就翻代码,先找文档。

找文档的位置

位置 看什么
项目根目录README.md 项目介绍、启动方式、技术栈
项目wiki/Confluence 架构设计、接口文档、数据库设计
项目doc/目录 设计文档、部署文档
Git提交历史 最近的改动方向
项目里的Swagger 接口列表和说明

README要重点看的内容

TEXT
1. 项目是做什么的(业务背景)
2. 用了哪些技术(技术栈)
3. 怎么启动(环境要求、启动步骤)
4. 项目结构(模块划分)
5. 配置说明(数据库、Redis、中间件)

如果README写得好,30分钟就能了解项目概况。

如果README很简陋或没有,那就得硬看代码了,往下看。


二、看技术栈

在项目根目录找pom.xml(Maven)或build.gradle(Gradle),看依赖列表。

从pom.xml看技术栈

XML
<!-- 框架 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- → SpringBoot Web项目 -->

<!-- 数据库 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- → MySQL + MyBatis-Plus -->

<!-- 缓存 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- → Redis -->

<!-- 消息队列 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- → RabbitMQ -->

<!-- 权限 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- → Spring Security -->

<!-- API文档 -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
<!-- → Knife4j接口文档 -->

整理技术栈清单

看到什么就记下来:

分类 技术
基础框架 SpringBoot 2.7.x
数据库 MySQL 8.0
ORM框架 MyBatis-Plus
缓存 Redis
消息队列 RabbitMQ
权限框架 Spring Security + JWT
接口文档 Knife4j
配置中心 Nacos
任务调度 XXL-JOB
日志框架 Logback
工具库 Hutool、Lombok

知道了技术栈,你大概就知道项目用了哪些东西,心里有底了。


三、看项目结构

单模块项目结构

TEXT
my-project/
  src/
    main/
      java/
        com/company/project/
          ProjectApplication.java    (启动类)
          controller/                 (控制器层)
          service/                    (业务逻辑层)
            impl/                     (实现类)
          mapper/ 或 dao/             (数据访问层)
          entity/ 或 model/           (实体类)
          dto/                        (数据传输对象)
          vo/                         (视图对象)
          config/                     (配置类)
          utils/                      (工具类)
          interceptor/                (拦截器)
          exception/                  (异常处理)
      resources/
        application.yml               (主配置)
        application-dev.yml            (环境配置)
        mapper/                       (MyBatis XML)
        static/                       (静态资源)
  pom.xml                             (依赖管理)

多模块项目结构

TEXT
my-project/
  pom.xml                             (父pom)
  common/                             (公共模块:工具类、常量、异常)
  model/                              (数据模型:实体、DTO、VO)
  dao/                                (数据访问:Mapper、XML)
  service/                            (业务逻辑)
  admin/                              (管理后台API)
    src/main/java/.../AdminApplication.java
  api/                                (对外API)
    src/main/java/.../ApiApplication.java
  job/                                (定时任务)
  gateway/                            (网关)

理解分层架构

TEXT
请求流向:

前端请求
  ↓
Controller(控制器)— 接收请求、参数校验、返回结果
  ↓
Service(业务逻辑)— 核心业务处理
  ↓
Mapper/DAO(数据访问)— 数据库操作
  ↓
Database(数据库)

每层的职责:

层 职责 不该做的事
Controller 接收请求、参数校验、调Service、返回结果 不写业务逻辑、不直接查数据库
Service 业务逻辑处理 不处理HTTP相关的参数、不返回HTTP相关的结果
Mapper/DAO 数据库操作 不写业务逻辑
Entity 数据库实体映射 不写业务逻辑
DTO 接收前端参数 不映射数据库表
VO 返回前端的数据 不映射数据库表

四、从入口开始看

1. 启动类

Java
@SpringBootApplication
@MapperScan("com.company.project.mapper")
@EnableScheduling
public class ProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProjectApplication.class, args);
    }
}

从注解能看出的信息:

  • @MapperScan — MyBatis Mapper扫描路径
  • @EnableScheduling — 开启定时任务
  • @EnableFeignClients — 用了Feign远程调用
  • @EnableDiscoveryClient — 注册到注册中心
  • @EnableAsync — 开启异步支持

2. 配置文件

YAML
server:
  port: 8080                    # 端口
  servlet:
    context-path: /api          # 路径前缀

spring:
  application:
    name: my-project            # 服务名
  datasource:                   # 数据源配置
    ...
  redis:                        # Redis配置
    ...
  cloud:
    nacos:                      # Nacos配置
      ...

从配置文件能看出项目依赖哪些中间件。

3. 找一个完整的请求链路

选一个简单的接口,从头到尾跟一遍:

TEXT
Controller → Service → Mapper → 数据库 → 返回

比如用户列表查询:

Controller:

Java
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public Result<List<UserVO>> list() {
        return Result.success(userService.list());
    }
}

Service接口:

Java
public interface UserService {
    List<UserVO> list();
}

Service实现:

Java
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<UserVO> list() {
        List<User> users = userMapper.selectList(null);
        return users.stream()
            .map(this::convertToVO)
            .collect(Collectors.toList());
    }
}

Mapper:

Java
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // MyBatis-Plus自带CRUD
}

Entity:

Java
@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String password;
    private String email;
    private Date createTime;
}

这样从Controller到数据库的完整链路就走通了。


五、看配置类

config/目录下的配置类能告诉你项目做了哪些定制化配置。

常见配置类

配置类 作用
WebMvcConfig 拦截器、跨域、静态资源
SecurityConfig 权限配置
RedisConfig Redis序列化方式
MybatisPlusConfig 分页插件、乐观锁
SwaggerConfig 接口文档
CorsConfig 跨域配置
ThreadPoolConfig 线程池配置
KafkaConfig 消息队列配置

怎么看

快速浏览每个配置类,知道做了什么就行:

Java
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        // Key用String序列化
        template.setKeySerializer(new StringRedisSerializer());
        // Value用JSON序列化
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

→ 这个配置说明Redis的Value用JSON序列化存储。


六、看数据库表结构

通过Entity看表结构

Java
@Data
@TableName("sys_user")
public class SysUser {
    @TableId(type = IdType.AUTO)
    private Long userId;        // → user_id 主键自增
    
    private String username;   // → username 用户名
    private String password;   // → password 密码
    private Long deptId;       // → dept_id 部门ID
    
    @TableField("phone_number")
    private String phone;      // → phone_number 手机号
    
    @TableLogic
    private Integer deleted;   // → deleted 逻辑删除字段
    
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;   // → create_time 创建时间
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;   // → update_time 更新时间
}

从Entity能看出:

  • 表名:sys_user
  • 字段映射:驼峰转下划线
  • 主键策略:自增
  • 逻辑删除:有deleted字段
  • 自动填充:创建时间和更新时间

用工具看表关系

用Navicat/DBeaver的"ER图"功能,可视化查看表之间的外键关系。


七、看接口列表

通过Swagger/Knife4j看

启动项目,访问:

TEXT
http://localhost:8080/doc.html        (Knife4j)
http://localhost:8080/swagger-ui.html (Swagger)

能看到所有接口的列表,按模块分类。

通过搜索Controller看

IDEA全局搜索@RestController或@RequestMapping:

  1. Ctrl+Shift+F(全局搜索)
  2. 搜索@RestController
  3. 看到所有Controller类
  4. 了解项目有哪些功能模块

八、快速了解项目的步骤总结

第1步:看README(10分钟)

了解项目是什么、做什么、怎么启动。

第2步:看pom.xml(5分钟)

了解用了哪些技术栈。

第3步:看项目目录结构(5分钟)

了解模块划分和分层结构。

第4步:看启动类和配置文件(10分钟)

了解项目入口和中间件依赖。

第5步:看一个完整接口链路(20分钟)

从Controller到Mapper走通一个接口。

第6步:看配置类(10分钟)

了解项目的定制化配置。

第7步:看数据库表结构(10分钟)

通过Entity或数据库工具了解数据模型。

第8步:看接口列表(10分钟)

通过Swagger了解所有功能模块。

总计约1.5小时,你就能对项目有基本了解了。


九、新人看代码的技巧

1. 不要试图一次看懂所有代码

几十万行代码,不可能一次全看懂。先了解整体结构,需要用到某个模块时再深入看。

2. 从自己要做的功能入手

导师给你分配了"用户管理"模块,就重点看UserController、UserService、UserMapper,其他模块先不管。

3. 善用IDEA的跳转功能

  • Ctrl+点击:跳转到定义
  • Ctrl+Alt+B:跳转到实现类
  • Ctrl+U:跳转到接口
  • Alt+F7:查看哪里调用了这个方法
  • Ctrl+F12:查看类结构

4. 画图

看懂一个模块后,画个简单的流程图或架构图,加深理解。

5. 写注释

看代码时,在不理解的地方加注释(自己的开发分支上),下次看就快了。

6. 跑起来调试

光看代码不够,把项目跑起来,打断点调试一遍:

  1. 请求一个接口
  2. 在Controller打断点
  3. F8单步执行
  4. 看每一步的数据变化
  5. 走通整个链路

调试一遍比看十遍代码都管用。


十、常见架构模式

1. 单体架构

所有功能在一个项目里,一个进程。

特点: 简单,适合小项目。部署方便。

2. 微服务架构

每个功能模块独立部署,独立数据库。

TEXT
用户服务 → 独立进程 + 独立数据库
订单服务 → 独立进程 + 独立数据库
商品服务 → 独立进程 + 独立数据库

特点: 复杂,适合大项目。需要注册中心、网关、配置中心。

3. 前后端分离

前端Vue/React + 后端SpringBoot,独立部署,通过API交互。

特点: 前后端可以并行开发。

判断你的项目是什么架构

特征 架构
只有一个启动类 单体架构
有多个启动类 可能是微服务
有gateway模块 微服务+网关
有feign依赖 微服务远程调用
有nacos/eureka 微服务注册中心

小结

步骤 时间 看什么
1 10分钟 README
2 5分钟 pom.xml技术栈
3 5分钟 项目目录结构
4 10分钟 启动类+配置文件
5 20分钟 一个完整接口链路
6 10分钟 配置类
7 10分钟 数据库表结构
8 10分钟 接口列表

1.5小时搞懂项目,然后从自己负责的模块开始深入。