🛠️ "工欲善其事,必先利其器。然后你会发现,光有器不行,还得会用。"
前言:为什么工具很重要
还记得刚学Java的时候吗?用记事本写代码,手动 javac 编译,然后 java 运行。那种纯粹的快乐,大概持续了...三天。
然后你发现:
- 写错一个分号,编译报错一百行
- 想重构一个方法名,要改二十个文件
- 调试全靠
System.out.println - 打包发布全靠玄学
于是你开始寻找工具,然后发现工具比代码还多...
本文将系统性地介绍Java开发中的各类工具,帮你从"工具困难症"中解脱出来。
一、工具全景图
mindmap
root((Java开发工具))
IDE集成开发环境
IntelliJ IDEA
Eclipse
VS Code
构建工具
Maven
Gradle
Ant
版本控制
Git
SVN
代码质量
SonarQube
Checkstyle
SpotBugs
PMD
调试诊断
Arthas
JProfiler
VisualVM
JConsole
API测试
Postman
Apifox
Bruno
数据库工具
DBeaver
Navicat
DataGrip
容器部署
Docker
Kubernetes
文档工具
Swagger
Javadoc
Markdown
其他工具
Lombok
MapStruct
JRebel
二、IDE:你的第二个家
2.1 IntelliJ IDEA —— 宇宙第一IDE
"用过IDEA的人,都不想再用别的了。" —— 真实的用户反馈
核心优势
| 特性 | 说明 |
|---|---|
| 智能补全 | 不只是补全,是读心术 |
| 重构能力 | 改名、提取、移动,一键搞定 |
| 调试器 | 强大到可以回退执行 |
| Git集成 | 图形化操作,告别命令行恐惧 |
| 插件生态 | 想要啥都有 |
必装插件清单
📦 效率提升类
├── Lombok # 注解生成getter/setter
├── MyBatisX # MyBatis增强,XML与Mapper跳转
├── GenerateAllSetter # 一键生成所有setter调用
├── GsonFormatPlus # JSON转Java实体类
├── String Manipulation # 字符串格式转换神器
└── Key Promoter X # 快捷键提示,帮你戒掉鼠标
📦 代码质量类
├── SonarLint # 代码质量实时检查
├── Alibaba Java Coding Guidelines # 阿里巴巴编码规范
├── CheckStyle-IDEA # 代码风格检查
└── SpotBugs # Bug静态分析
📦 工具增强类
├── Maven Helper # Maven依赖分析/冲突解决
├── JRebel # 热部署神器(付费)
├── RestfulTool # RESTful接口快速测试
├── Translation # 翻译插件,英文文档救星
└── Rainbow Brackets # 彩虹括号,嵌套不迷路
📦 美化类
├── One Dark Theme # 暗色主题
├── Atom Material Icons # 文件图标美化
└── Nyan Progress Bar # 彩虹猫进度条(摸鱼必备)常用快捷键速查
🔥 高频快捷键(macOS / Windows)
【导航】
⌘O / Ctrl+N → 查找类
⌘⇧O / Ctrl+Shift+N → 查找文件
⌘⌥O / Ctrl+Shift+Alt+N → 查找符号(方法/变量)
⌘E / Ctrl+E → 最近打开的文件
⌘B / Ctrl+B → 跳转到定义
⌘⌥B / Ctrl+Alt+B → 跳转到实现
⌘U / Ctrl+U → 跳转到父类/接口
⌘[ / Ctrl+Alt+← → 返回上一个位置
⌘] / Ctrl+Alt+→ → 前进到下一个位置
【编辑】
⌘D / Ctrl+D → 复制当前行
⌘⌫ / Ctrl+Y → 删除当前行
⌥⇧↑ / Alt+Shift+↑ → 上移当前行
⌘/ / Ctrl+/ → 单行注释
⌘⌥/ / Ctrl+Shift+/ → 多行注释
⌘⌥L / Ctrl+Alt+L → 格式化代码
⌘⌥O / Ctrl+Alt+O → 优化导入
【重构】
⇧F6 / Shift+F6 → 重命名
⌘⌥M / Ctrl+Alt+M → 提取方法
⌘⌥V / Ctrl+Alt+V → 提取变量
⌘⌥F / Ctrl+Alt+F → 提取字段
⌘⌥C / Ctrl+Alt+C → 提取常量
【调试】
F8 → 单步跳过
F7 → 单步进入
⇧F8 / Shift+F8 → 单步跳出
F9 → 继续执行
⌘F8 / Ctrl+F8 → 切换断点
【生成】
⌘N / Alt+Insert → 生成代码(构造器/getter/setter等)
⌘⌥T / Ctrl+Alt+T → 包围代码(try-catch/if等)
⌘J / Ctrl+J → 插入Live TemplateIDEA 高级技巧
// 1. Postfix Completion —— 后缀补全
user.null → if (user == null) { }
user.notnull → if (user != null) { }
user.var → User user = user;
list.for → for (Item item : list) { }
list.fori → for (int i = 0; i < list.size(); i++) { }
result.return → return result;
exception.throw → throw exception;
// 2. Live Templates —— 代码模板
sout → System.out.println();
soutv → System.out.println("变量 = " + 变量);
psvm → public static void main(String[] args) { }
fori → for (int i = 0; i < ; i++) { }
iter → for (Object o : ) { }
// 3. 自定义 Live Template
// Settings → Editor → Live Templates
// 示例:创建 "log" 模板
private static final Logger log = LoggerFactory.getLogger($CLASS$.class);
// 设置 $CLASS$ 变量为 className()2.2 VS Code —— 轻量级选手
适合场景:
- 快速编辑配置文件
- 前端开发
- 轻量级Java项目
- Markdown写作
Java开发必装扩展:
Extension Pack for Java # 微软官方Java扩展包
Spring Boot Extension Pack # Spring Boot支持
Lombok Annotations Support # Lombok支持2.3 IDE对比
quadrantChart
title IDE选择象限图
x-axis 轻量 --> 功能丰富
y-axis 免费 --> 付费
quadrant-1 企业首选
quadrant-2 个人付费
quadrant-3 入门首选
quadrant-4 轻量免费
IntelliJ Ultimate: [0.9, 0.85]
IntelliJ Community: [0.75, 0.15]
Eclipse: [0.7, 0.1]
VS Code: [0.3, 0.1]
NetBeans: [0.5, 0.1]
三、构建工具:项目的骨架
3.1 Maven —— 稳如老狗
"Maven虽然XML写到手软,但它就是稳。"
核心概念
flowchart TB
subgraph 生命周期
A[clean] --> B[validate]
B --> C[compile]
C --> D[test]
D --> E[package]
E --> F[verify]
F --> G[install]
G --> H[deploy]
end
subgraph 核心要素
I[POM.xml]
J[依赖管理]
K[插件系统]
L[仓库机制]
end
I --> J
I --> K
J --> L
pom.xml 模板
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 项目坐标 -->
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 属性配置 -->
<properties>
<java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 依赖版本统一管理 -->
<spring-boot.version>3.2.0</spring-boot.version>
<lombok.version>1.18.30</lombok.version>
</properties>
<!-- 依赖管理(用于多模块项目) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
<!-- 多环境配置 -->
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
</project>Maven 常用命令
# 基础命令
mvn clean # 清理target目录
mvn compile # 编译源代码
mvn test # 运行测试
mvn package # 打包
mvn install # 安装到本地仓库
mvn deploy # 部署到远程仓库
# 组合命令
mvn clean package # 清理并打包
mvn clean install -DskipTests # 跳过测试安装
mvn clean package -P prod # 使用prod环境打包
# 依赖相关
mvn dependency:tree # 查看依赖树
mvn dependency:analyze # 分析依赖(找出未使用的)
mvn versions:display-dependency-updates # 检查依赖更新
# 调试相关
mvn -X clean package # Debug模式,输出详细日志
mvn -e clean package # 显示错误堆栈
# 多模块项目
mvn -pl module-name clean package # 只构建指定模块
mvn -am -pl module-name clean package # 同时构建依赖模块Maven Wrapper(推荐)
# 生成Maven Wrapper
mvn wrapper:wrapper
# 使用Wrapper(无需安装Maven)
./mvnw clean package # Linux/Mac
mvnw.cmd clean package # Windows3.2 Gradle —— 新时代的选择
"Gradle:用代码写构建脚本,真香!"
build.gradle.kts(Kotlin DSL)
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
java
id("org.springframework.boot") version "3.2.0"
id("io.spring.dependency-management") version "1.1.4"
kotlin("jvm") version "1.9.20"
kotlin("plugin.spring") version "1.9.20"
}
group = "com.example"
version = "1.0.0-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_17
}
repositories {
mavenCentral()
// 阿里云镜像
maven { url = uri("https://maven.aliyun.com/repository/public") }
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
runtimeOnly("com.mysql:mysql-connector-j")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
// 自定义任务
tasks.register("hello") {
doLast {
println("Hello from Gradle!")
}
}Gradle 常用命令
# 基础命令
./gradlew clean # 清理
./gradlew build # 构建
./gradlew test # 测试
./gradlew bootRun # 运行Spring Boot应用
# 依赖相关
./gradlew dependencies # 查看依赖树
./gradlew dependencyInsight --dependency lombok # 查看特定依赖
# 任务相关
./gradlew tasks # 列出所有任务
./gradlew tasks --all # 列出所有任务(包括隐藏的)
# 性能优化
./gradlew build --parallel # 并行构建
./gradlew build --build-cache # 使用构建缓存3.3 Maven vs Gradle
| 特性 | Maven | Gradle |
|---|---|---|
| 配置语言 | XML | Groovy/Kotlin DSL |
| 学习曲线 | 较低 | 较高 |
| 构建速度 | 一般 | 快(增量构建+缓存) |
| 灵活性 | 约定优于配置 | 高度灵活 |
| IDE支持 | 优秀 | 优秀 |
| 社区生态 | 非常成熟 | 快速增长 |
| 适用场景 | 企业标准项目 | 复杂构建/Android |
四、代码质量工具
4.1 静态代码分析
flowchart LR
A[代码提交] --> B[SonarLint
IDE实时检查] B --> C[Git Commit] C --> D[CI Pipeline] D --> E[SonarQube
服务端分析] E --> F{质量门禁} F -->|通过| G[部署] F -->|失败| H[修复] H --> A
IDE实时检查] B --> C[Git Commit] C --> D[CI Pipeline] D --> E[SonarQube
服务端分析] E --> F{质量门禁} F -->|通过| G[部署] F -->|失败| H[修复] H --> A
SonarQube 集成
<!-- Maven插件配置 -->
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.10.0.2594</version>
</plugin># 执行分析
mvn sonar:sonar \
-Dsonar.projectKey=my-project \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=your-tokenCheckstyle 配置
<!-- pom.xml -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
</configuration>
</plugin><!-- checkstyle.xml 简化版 -->
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="TreeWalker">
<!-- 命名规范 -->
<module name="ConstantName"/>
<module name="LocalVariableName"/>
<module name="MethodName"/>
<module name="TypeName"/>
<!-- 代码风格 -->
<module name="AvoidStarImport"/>
<module name="OneStatementPerLine"/>
<module name="EmptyBlock"/>
<!-- 复杂度 -->
<module name="CyclomaticComplexity">
<property name="max" value="10"/>
</module>
</module>
<!-- 文件级别 -->
<module name="FileLength">
<property name="max" value="500"/>
</module>
</module>SpotBugs(FindBugs继任者)
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.8.2.0</version>
<configuration>
<effort>Max</effort>
<threshold>Low</threshold>
<xmlOutput>true</xmlOutput>
</configuration>
</plugin>4.2 代码格式化
Google Java Format
<plugin>
<groupId>com.spotify.fmt</groupId>
<artifactId>fmt-maven-plugin</artifactId>
<version>2.21.1</version>
<executions>
<execution>
<goals>
<goal>format</goal>
</goals>
</execution>
</executions>
</plugin>EditorConfig(统一编辑器配置)
# .editorconfig
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.{yml,yaml}]
indent_size = 2
[*.md]
trim_trailing_whitespace = false五、调试诊断工具
5.1 Arthas —— 线上诊断神器
"有了Arthas,线上问题不用重启就能查。"
安装与启动
# 下载
curl -O https://arthas.aliyun.com/arthas-boot.jar
# 启动(自动attach到Java进程)
java -jar arthas-boot.jar常用命令速查
# 🔍 基础命令
dashboard # 实时数据面板
thread # 查看线程状态
thread -n 3 # 查看最忙的3个线程
thread -b # 查看阻塞线程
jvm # JVM信息
sysprop # 系统属性
sysenv # 环境变量
# 🔍 类/方法相关
sc com.example.* # 搜索类
sm com.example.UserService # 搜索方法
jad com.example.UserService # 反编译类
# 🔍 方法监控
watch com.example.UserService getUser returnObj # 观察返回值
watch com.example.UserService getUser '{params,returnObj}' -x 2 # 观察入参和返回值
trace com.example.UserService getUser # 方法调用路径追踪
tt -t com.example.UserService getUser # 记录方法调用(TimeTunnel)
tt -l # 查看记录
tt -p -i 1001 # 重放调用
# 🔍 性能分析
profiler start # 开始CPU分析
profiler stop # 停止并生成火焰图
profiler stop --format html # 生成HTML格式
# 🔍 热修复(慎用)
redefine /tmp/UserService.class # 热更新类
# 🔍 其他
ognl '@java.lang.System@out.println("hello")' # 执行OGNL表达式
vmtool --action getInstances --className com.example.User # 获取对象实例Arthas 实战场景
# 场景1:接口响应慢,定位耗时方法
trace com.example.OrderService createOrder '#cost > 100'
# 场景2:查看方法入参和返回值
watch com.example.UserService login '{params,returnObj,throwExp}' -e -x 3
# 场景3:统计方法调用次数和RT
monitor -c 5 com.example.UserService getUser
# 场景4:查看Spring Bean
vmtool --action getInstances \
--className org.springframework.context.ApplicationContext \
--express 'instances[0].getBean("userService")'5.2 JProfiler —— 专业性能分析
flowchart TB
subgraph JProfiler功能
A[CPU分析]
B[内存分析]
C[线程分析]
D[数据库分析]
E[HTTP分析]
end
A --> A1[热点方法]
A --> A2[调用树]
A --> A3[火焰图]
B --> B1[堆内存快照]
B --> B2[对象分配]
B --> B3[GC分析]
C --> C1[线程状态]
C --> C2[锁分析]
C --> C3[死锁检测]
5.3 VisualVM —— 免费的可视化工具
# JDK自带,直接运行
jvisualvm
# 或者下载独立版本
# https://visualvm.github.io/功能:
- 监控CPU、内存、线程
- 堆Dump分析
- 线程Dump分析
- 采样器和分析器
- 插件扩展
5.4 JVM 命令行工具
# jps - 列出Java进程
jps -l # 显示完整主类名
jps -v # 显示JVM参数
# jstack - 线程堆栈
jstack <pid> # 打印线程堆栈
jstack -l <pid> # 包含锁信息
# jmap - 内存映射
jmap -heap <pid> # 堆内存概况
jmap -histo <pid> # 对象直方图
jmap -dump:format=b,file=heap.hprof <pid> # 导出堆转储
# jstat - JVM统计
jstat -gc <pid> 1000 # 每秒输出GC统计
jstat -gcutil <pid> 1000 # GC百分比统计
# jinfo - JVM配置
jinfo <pid> # 查看所有配置
jinfo -flag MaxHeapSize <pid> # 查看特定参数
# jcmd - 统一诊断命令(推荐)
jcmd <pid> VM.flags # JVM参数
jcmd <pid> Thread.print # 线程堆栈
jcmd <pid> GC.heap_info # 堆信息
jcmd <pid> GC.run # 触发GC六、API开发测试工具
6.1 Postman —— API测试王者
核心功能
📦 Postman功能
├── 请求构建 # GET/POST/PUT/DELETE等
├── 环境变量 # dev/test/prod环境切换
├── 集合管理 # API分组管理
├── 预请求脚本 # 请求前执行JS
├── 测试脚本 # 响应后断言
├── Mock Server # 模拟服务
├── API文档 # 自动生成文档
└── 团队协作 # 共享集合脚本示例
// Pre-request Script - 生成签名
const timestamp = Date.now();
const secret = pm.environment.get("secret");
const sign = CryptoJS.MD5(timestamp + secret).toString();
pm.environment.set("timestamp", timestamp);
pm.environment.set("sign", sign);
// Tests - 断言响应
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Response has userId", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.data).to.have.property('userId');
});
// 提取Token并保存
var jsonData = pm.response.json();
if (jsonData.data && jsonData.data.token) {
pm.environment.set("token", jsonData.data.token);
}6.2 Apifox —— 国产全能选手
"Postman + Swagger + Mock = Apifox"
优势:
- 中文界面友好
- API设计 + 调试 + Mock + 测试一体化
- 支持导入Swagger/OpenAPI
- 团队协作功能完善
- 免费版功能够用
6.3 HTTP Client(IDEA内置)
### 登录接口
POST http://localhost:8080/api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "123456"
}
> {%
client.global.set("token", response.body.data.token);
%}
### 获取用户信息(使用上一步的token)
GET http://localhost:8080/api/user/info
Authorization: Bearer {{token}}
### 带环境变量
GET {{host}}/api/users
Accept: application/json七、数据库工具
7.1 工具对比
| 工具 | 价格 | 支持数据库 | 特点 |
|---|---|---|---|
| DBeaver | 免费/付费 | 80+ | 开源,功能全面 |
| DataGrip | 付费 | 主流全支持 | JetBrains出品,智能 |
| Navicat | 付费 | MySQL/PostgreSQL等 | 老牌,稳定 |
| MySQL Workbench | 免费 | MySQL | 官方工具 |
| TablePlus | 付费 | 主流全支持 | macOS原生,美观 |
7.2 DBeaver 推荐配置
🔧 常用设置
├── SQL编辑器
│ ├── 自动补全(Ctrl+Space)
│ ├── 格式化快捷键(Ctrl+Shift+F)
│ └── 执行快捷键(Ctrl+Enter)
├── 连接配置
│ ├── 保存密码
│ ├── SSH隧道
│ └── 只读模式(生产环境)
└── 数据导出
├── CSV/Excel/JSON/SQL
└── 批量导出表结构7.3 数据库版本管理
Flyway
// application.yml
spring:
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true
// 脚本命名规则:V1__Create_user_table.sql
// V{版本号}__{描述}.sql-- V1__Create_user_table.sql
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- V2__Add_email_column.sql
ALTER TABLE user ADD COLUMN email VARCHAR(100);Liquibase
<!-- db/changelog/db.changelog-master.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd">
<changeSet id="1" author="joey">
<createTable tableName="user">
<column name="id" type="BIGINT" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="username" type="VARCHAR(50)">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
</databaseChangeLog>八、文档工具
8.1 Swagger/OpenAPI
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("用户服务API")
.version("1.0.0")
.description("用户管理相关接口")
.contact(new Contact()
.name("Joey")
.email("joey@example.com")))
.externalDocs(new ExternalDocumentation()
.description("项目Wiki")
.url("https://wiki.example.com"));
}
}@RestController
@RequestMapping("/api/users")
@Tag(name = "用户管理", description = "用户CRUD接口")
public class UserController {
@Operation(summary = "获取用户列表", description = "分页获取用户列表")
@Parameters({
@Parameter(name = "page", description = "页码", example = "1"),
@Parameter(name = "size", description = "每页数量", example = "10")
})
@GetMapping
public Result<Page<UserVO>> listUsers(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
return Result.success(userService.list(page, size));
}
@Operation(summary = "创建用户")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "创建成功"),
@ApiResponse(responseCode = "400", description = "参数错误")
})
@PostMapping
public Result<UserVO> createUser(
@RequestBody @Valid UserCreateDTO dto) {
return Result.success(userService.create(dto));
}
}8.2 Javadoc 规范
/**
* 用户服务类,提供用户相关的业务操作。
*
* <p>主要功能包括:
* <ul>
* <li>用户注册和登录</li>
* <li>用户信息管理</li>
* <li>权限验证</li>
* </ul>
*
* <p>使用示例:
* <pre>{@code
* UserService userService = new UserService();
* User user = userService.findById(1L);
* }</pre>
*
* @author Joey
* @version 1.0.0
* @since 2024-01-01
* @see UserRepository
*/
public class UserService {
/**
* 根据ID查询用户。
*
* @param id 用户ID,不能为null
* @return 用户对象,如果不存在返回null
* @throws IllegalArgumentException 如果id为null
* @throws UserNotFoundException 如果用户不存在
*/
public User findById(Long id) {
// ...
}
/**
* 创建新用户。
*
* @param dto 用户创建参数
* @return 创建成功的用户对象
* @deprecated 使用 {@link #createUserV2(UserCreateDTO)} 代替
*/
@Deprecated
public User createUser(UserCreateDTO dto) {
// ...
}
}九、效率神器
9.1 Lombok —— 告别样板代码
// 之前:几十行getter/setter/toString...
public class User {
private Long id;
private String username;
private String email;
// ... getter/setter/toString/equals/hashCode
}
// 之后:几个注解搞定
@Data // getter/setter/toString/equals/hashCode
@Builder // 建造者模式
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 全参构造
@Slf4j // 日志对象
public class User {
private Long id;
private String username;
private String email;
}
// 使用示例
User user = User.builder()
.id(1L)
.username("joey")
.email("joey@example.com")
.build();
log.info("Created user: {}", user);Lombok 注解速查
| 注解 | 作用 |
|---|---|
@Getter/@Setter | 生成getter/setter |
@ToString | 生成toString |
@EqualsAndHashCode | 生成equals和hashCode |
@Data | 以上四个的组合 |
@Builder | 建造者模式 |
@NoArgsConstructor | 无参构造器 |
@AllArgsConstructor | 全参构造器 |
@RequiredArgsConstructor | final字段构造器 |
@Slf4j | 生成log对象 |
@Value | 不可变类 |
@SneakyThrows | 偷偷抛出受检异常 |
@Cleanup | 自动关闭资源 |
9.2 MapStruct —— 对象映射神器
// 定义Mapper接口
@Mapper(componentModel = "spring")
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
// 简单映射
UserVO toVO(User user);
// 批量映射
List<UserVO> toVOList(List<User> users);
// 字段名不同时
@Mapping(source = "createTime", target = "createdAt")
@Mapping(source = "updateTime", target = "updatedAt")
UserVO toVOWithMapping(User user);
// 忽略某些字段
@Mapping(target = "password", ignore = true)
UserVO toVOWithoutPassword(User user);
// 使用表达式
@Mapping(target = "fullName", expression = "java(user.getFirstName() + \" \" + user.getLastName())")
UserVO toVOWithExpression(User user);
// 更新已有对象
void updateUserFromDTO(UserUpdateDTO dto, @MappingTarget User user);
}
// 使用
User user = userRepository.findById(id);
UserVO vo = UserMapper.INSTANCE.toVO(user);9.3 JRebel —— 热部署神器
"改代码不用重启,节省的时间可以多喝两杯咖啡。"
功能:
- 修改Java代码即时生效
- 修改配置文件即时生效
- 修改资源文件即时生效
- 支持大部分框架
价格:付费(但真的很值)
9.4 其他效率工具
📦 开发效率工具
├── DevToys # Windows开发者工具箱
├── He3 # 开发者工具集合
├── Regex101 # 正则表达式测试
├── JSON Formatter # JSON格式化
├── Cron表达式生成器 # Cron在线生成
└── PlantUML # 文本画UML图
📦 终端工具
├── iTerm2 # macOS终端增强
├── Oh My Zsh # Zsh配置框架
├── Windows Terminal # Windows终端
└── Tmux # 终端复用
📦 效率工具
├── Alfred/Raycast # macOS效率启动器
├── Snipaste # 截图贴图
├── Typora # Markdown编辑器
└── Draw.io # 流程图绘制十、工具链整合:从开发到部署
flowchart LR
subgraph 开发阶段
A[IDEA] --> B[编码]
B --> C[Lombok/MapStruct]
C --> D[本地测试]
D --> E[Arthas调试]
end
subgraph 提交阶段
F[Git提交] --> G[Pre-commit Hook]
G --> H[Checkstyle检查]
H --> I[单元测试]
end
subgraph CI/CD
J[Jenkins/GitLab CI] --> K[Maven/Gradle构建]
K --> L[SonarQube扫描]
L --> M[Docker打包]
M --> N[K8s部署]
end
E --> F
I --> J
完整工具链示例
# .gitlab-ci.yml 示例
stages:
- build
- test
- quality
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
build:
stage: build
image: maven:3.9-eclipse-temurin-17
script:
- mvn clean package -DskipTests
artifacts:
paths:
- target/*.jar
test:
stage: test
script:
- mvn test
artifacts:
reports:
junit: target/surefire-reports/*.xml
sonarqube:
stage: quality
script:
- mvn sonar:sonar -Dsonar.host.url=$SONAR_HOST -Dsonar.login=$SONAR_TOKEN
only:
- main
- develop
deploy-prod:
stage: deploy
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- kubectl set image deployment/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- main
when: manual十一、总结
工具选择原则
flowchart TD
A[选择工具] --> B{团队是否已有标准?}
B -->|是| C[遵循团队标准]
B -->|否| D{项目规模?}
D -->|小型| E[选择轻量级工具]
D -->|大型| F[选择功能全面的工具]
E --> G{是否免费?}
F --> G
G -->|需要免费| H[开源方案]
G -->|可以付费| I[商业方案]
工具推荐总结
| 类别 | 首选 | 备选 |
|---|---|---|
| IDE | IntelliJ IDEA | VS Code |
| 构建 | Maven/Gradle | - |
| 版本控制 | Git | - |
| 代码质量 | SonarQube + SonarLint | Checkstyle + SpotBugs |
| 调试 | Arthas | JProfiler (付费) |
| API测试 | Apifox | Postman |
| 数据库 | DBeaver | DataGrip (付费) |
| 文档 | Swagger/OpenAPI | - |
| 效率 | Lombok + MapStruct | - |
最后的话
"工具不在多,够用就好。关键是形成自己的工作流,让工具为你服务,而不是被工具绑架。"
记住:
- 先掌握核心工具:IDE、构建工具、Git,这三个必须精通
- 按需引入其他工具:不要为了用工具而用工具
- 持续优化工作流:定期review自己的开发效率,发现瓶颈
- 分享和交流:好工具要分享给团队,提升整体效率