入职拿到一个几十万行的项目,一脸懵逼不知道从哪看起。这节教你一套方法论,快速搞懂公司项目的结构和脉络。
一、先看文档
别上来就翻代码,先找文档。
找文档的位置
| 位置 | 看什么 |
|---|---|
| 项目根目录README.md | 项目介绍、启动方式、技术栈 |
| 项目wiki/Confluence | 架构设计、接口文档、数据库设计 |
| 项目doc/目录 | 设计文档、部署文档 |
| Git提交历史 | 最近的改动方向 |
| 项目里的Swagger | 接口列表和说明 |
README要重点看的内容
1. 项目是做什么的(业务背景)
2. 用了哪些技术(技术栈)
3. 怎么启动(环境要求、启动步骤)
4. 项目结构(模块划分)
5. 配置说明(数据库、Redis、中间件)
如果README写得好,30分钟就能了解项目概况。
如果README很简陋或没有,那就得硬看代码了,往下看。
二、看技术栈
在项目根目录找pom.xml(Maven)或build.gradle(Gradle),看依赖列表。
从pom.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 |
知道了技术栈,你大概就知道项目用了哪些东西,心里有底了。
三、看项目结构
单模块项目结构
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 (依赖管理)
多模块项目结构
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/ (网关)
理解分层架构
请求流向:
前端请求
↓
Controller(控制器)— 接收请求、参数校验、返回结果
↓
Service(业务逻辑)— 核心业务处理
↓
Mapper/DAO(数据访问)— 数据库操作
↓
Database(数据库)
每层的职责:
| 层 | 职责 | 不该做的事 |
|---|---|---|
| Controller | 接收请求、参数校验、调Service、返回结果 | 不写业务逻辑、不直接查数据库 |
| Service | 业务逻辑处理 | 不处理HTTP相关的参数、不返回HTTP相关的结果 |
| Mapper/DAO | 数据库操作 | 不写业务逻辑 |
| Entity | 数据库实体映射 | 不写业务逻辑 |
| DTO | 接收前端参数 | 不映射数据库表 |
| VO | 返回前端的数据 | 不映射数据库表 |
四、从入口开始看
1. 启动类
@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. 配置文件
server:
port: 8080 # 端口
servlet:
context-path: /api # 路径前缀
spring:
application:
name: my-project # 服务名
datasource: # 数据源配置
...
redis: # Redis配置
...
cloud:
nacos: # Nacos配置
...
从配置文件能看出项目依赖哪些中间件。
3. 找一个完整的请求链路
选一个简单的接口,从头到尾跟一遍:
Controller → Service → Mapper → 数据库 → 返回
比如用户列表查询:
Controller:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public Result<List<UserVO>> list() {
return Result.success(userService.list());
}
}
Service接口:
public interface UserService {
List<UserVO> list();
}
Service实现:
@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:
@Mapper
public interface UserMapper extends BaseMapper<User> {
// MyBatis-Plus自带CRUD
}
Entity:
@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 | 消息队列配置 |
怎么看
快速浏览每个配置类,知道做了什么就行:
@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看表结构
@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看
启动项目,访问:
http://localhost:8080/doc.html (Knife4j)
http://localhost:8080/swagger-ui.html (Swagger)
能看到所有接口的列表,按模块分类。
通过搜索Controller看
IDEA全局搜索@RestController或@RequestMapping:
Ctrl+Shift+F(全局搜索)- 搜索
@RestController - 看到所有Controller类
- 了解项目有哪些功能模块
八、快速了解项目的步骤总结
第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. 跑起来调试
光看代码不够,把项目跑起来,打断点调试一遍:
- 请求一个接口
- 在Controller打断点
- F8单步执行
- 看每一步的数据变化
- 走通整个链路
调试一遍比看十遍代码都管用。
十、常见架构模式
1. 单体架构
所有功能在一个项目里,一个进程。
特点: 简单,适合小项目。部署方便。
2. 微服务架构
每个功能模块独立部署,独立数据库。
用户服务 → 独立进程 + 独立数据库
订单服务 → 独立进程 + 独立数据库
商品服务 → 独立进程 + 独立数据库
特点: 复杂,适合大项目。需要注册中心、网关、配置中心。
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小时搞懂项目,然后从自己负责的模块开始深入。