跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 常用注解扩展对比

对比了 Java 开发中常用的各类注解,涵盖 Spring MVC 控制器、Lombok 数据类、MyBatis-Plus 表映射、依赖注入、参数绑定、JPA 实体映射、配置管理、事务管理及测试注解等场景。重点分析了@Controller 与@RestController、@Data 与手动编写、@TableName 规则、@Autowired 与@Resource 等核心区别,并提供了代码示例与最佳实践建议,帮助开发者规范注解使用,提升代码质量与团队协作效率。

ByteFlow发布于 2026/2/5更新于 2026/7/144.8K 浏览
Java 常用注解扩展对比

Java 常用注解扩展对比

一、@Controller 与 @RestController 对比

对比维度@Controller@RestController
定义Spring MVC 的基础控制器注解@Controller + @ResponseBody 的组合注解
返回值处理返回视图名称(需配合视图解析器)直接返回 JSON/XML 数据(自动添加 @ResponseBody)
适用场景传统 MVC 架构(如 JSP/Thymeleaf 页面渲染)RESTful API 开发(前后端分离场景)
HTTP 响应头Content-Type: text/html(默认)Content-Type: application/json(默认)
@Controller
public class WebCtrl {
    @GetMapping("/page")
    public String page() {
        return "index"; // 返回视图名
    }
}

@RestController
public class ApiCtrl {
    @GetMapping("/data")
    public User data() {
        return userService.findUser(); // 自动转 JSON
    }
}

二、使用 @Data 与 不使用 @Data 对比

对比维度使用 @Data不使用 @Data
代码量自动生成以下方法:\n- 所有字段的 getter/setter\n- toString()\n- equals()/hashCode()需手动编写所有方法
维护性字段增减时无需修改方法字段变更需同步修改相关方法
继承关系处理需显式添加 @EqualsAndHashCode(callSuper=true) 包含父类字段手动编写时可直接控制是否包含父类字段
框架兼容性依赖 Lombok 插件(需 IDE 支持)无额外依赖
@Data
public class User {
    private Long id;
    private String name;
    // 自动生成所有方法
}

public class ManualUser {
    private Long id;
    private String name;
    // 手动编写 getter/setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
}

注意事项:

  1. 使用 @Data 时,若类有继承关系,需添加 @EqualsAndHashCode(callSuper=true)
  2. 某些场景(如 JPA 实体类)需显式定义无参构造器(通过 @NoArgsConstructor)

三、使用 @TableName 与 不使用 @TableName 对比

对比维度使用 @TableName不使用 @TableName
表名映射规则显式指定数据库表名(如 @TableName("sys_user"))按 MyBatis-Plus 默认规则映射:\n类名驼峰转下划线(如 SysUser → sys_user)
适用场景1. 表名含特殊字符(如 user-info)\n2. 类名与表名无对应关系类名与表名严格遵循驼峰转下划线规则
全局配置覆盖优先级高于全局配置可通过配置文件统一设置表名前缀:\nmybatis-plus.global-config.db-config.table-prefix=sys_
@Data
@TableName("sys_user") // 显式指定表名
public class User {
    private Long id;
}

@Data
public class SysUser { // 默认映射为 sys_user
    private Long id;
}

注意事项:

  1. 表名包含 SQL 关键字时需转义:@TableName("order")
  2. 分表场景可通过动态表名处理器(TableNameHandler)实现

四、依赖注入注解对比

注解对核心区别使用场景
@Autowired vs @Resource- @Autowired(Spring)按类型注入\n- @Resource(JSR-250)按名称注入明确指定 Bean 名称时用 @Resource,优先使用构造器注入时用 @Autowired
@Primary vs @Qualifier- @Primary标记首选 Bean\n- @Qualifier指定具体 Bean 名称存在多个相同类型 Bean 时,优先使用 @Primary,需精确控制时用 @Qualifier

代码示例:

// @Autowired + @Qualifier
@Autowired
@Qualifier("mysqlDataSource")
private DataSource dataSource;

// @Resource
@Resource(name = "oracleDataSource")
private DataSource dataSource;

五、Spring MVC 参数绑定注解对比

注解对核心区别使用场景
@RequestParam vs @PathVariable- @RequestParam获取 URL 参数\n- @PathVariable获取 URI 模板变量RESTful 风格 URL 用 @PathVariable,传统表单参数用 @RequestParam
@ModelAttribute vs @RequestBody- @ModelAttribute绑定 Form 表单数据\n- @RequestBody绑定 JSON 请求体表单提交用 @ModelAttribute,API 接口传输复杂对象用 @RequestBody

代码示例:

// PathVariable
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    ...
}

// RequestBody
@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody UserDTO userDTO) {
    ...
}

六、JPA/Hibernate 映射注解对比

注解对核心区别使用场景
@Entity vs @Table- @Entity声明 JPA 实体类\n- @Table指定数据库表名类名与表名不一致时使用 @Table
@Column vs @Transient- @Column映射数据库列\n- @Transient标记非持久化字段字段需要特殊列名或类型时用 @Column,临时计算字段用 @Transient
@OneToMany vs @ManyToOne- 定义一对多/多对一关系根据业务关系方向选择(部门 - 员工:部门用 @OneToMany,员工用 @ManyToOne)

代码示例:

@Entity
@Table(name = "departments")
public class Department {
    @OneToMany(mappedBy = "department")
    private List<Employee> employees;
}

@Entity
public class Employee {
    @ManyToOne
    @JoinColumn(name = "dept_id")
    private Department department;
}

七、Spring Boot 配置注解对比

注解对核心区别使用场景
@Value vs @ConfigurationProperties- @Value注入单个属性\n- @ConfigurationProperties批量绑定属性简单配置用 @Value,复杂配置对象用 @ConfigurationProperties
@Profile vs @Conditional- @Profile按环境激活配置\n- @Conditional按条件创建 Bean多环境配置用 @Profile,动态装配逻辑用 @Conditional

配置示例:

app:
  security:
    enabled: true
    timeout: 300

代码实现:

@Configuration
@ConfigurationProperties(prefix = "app.security")
public class SecurityConfig {
    private boolean enabled;
    private int timeout;
    // getters/setters
}

八、Lombok 注解对比

注解对核心区别使用场景
@Data vs @Value- @Data生成可变对象\n- @Value生成不可变对象(final 字段)需要修改字段值时用 @Data,只读数据传输对象用 @Value
@Builder vs @AllArgsConstructor- @Builder支持链式构建\n- @AllArgsConstructor生成全参构造器复杂对象构建用 @Builder,依赖注入全参构造用 @AllArgsConstructor

代码示例:

@Value
@Builder
public class ImmutablePoint {
    private final int x;
    private final int y;
}
// 使用 ImmutablePoint point = ImmutablePoint.builder().x(10).y(20).build();

九、事务管理注解对比

注解对核心区别使用场景
@Transactional vs @Modifying- @Transactional声明事务边界\n- @Modifying标记 DML 操作服务层方法用 @Transactional,JPA 更新查询用 @Modifying

代码示例:

@Service
public class UserService {
    @Transactional
    public void updateUser(User user) {
        userRepository.save(user);
    }
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @Query("UPDATE User u SET u.name = ?1 WHERE u.id = ?2")
    int updateNameById(String name, Long id);
}

十、测试相关注解对比

注解对核心区别使用场景
@Mock vs @MockBean- @Mock(Mockito)创建模拟对象\n- @MockBean(Spring Boot Test)替换 Spring 容器中的 Bean单元测试用 @Mock,集成测试用 @MockBean
@SpringBootTest vs @WebMvcTest- @SpringBootTest加载完整上下文\n- @WebMvcTest仅加载 Web 层组件全集成测试用 @SpringBootTest,控制层隔离测试用 @WebMvcTest

测试示例:

// 全集成测试
@SpringBootTest
class UserServiceIntegrationTest {
    @Autowired
    private UserService userService;
}

// 控制层测试
@WebMvcTest(UserController.class)
class UserControllerTest {
    @MockBean
    private UserService userService;
    @Autowired
    private MockMvc mockMvc;
}

综合对比总结表

功能场景推荐注解组合典型应用
REST API 开发@RestController + @RequestBody + @Valid前后端分离接口开发
JPA 实体映射@Entity + @Table + @Column + @OneToMany数据库表结构映射
配置管理@ConfigurationProperties + @Profile多环境配置切换
测试覆盖@SpringBootTest + @MockBean + @DataJpaTest(按需选择)分层测试策略
依赖注入构造器注入优先,@Autowired + @Qualifier避免循环依赖

最佳实践建议

  1. 分层使用
    严格遵循 Controller→Service→Repository 分层架构,避免跨层注解混用。
  2. 注解最小化
    • 优先使用框架提供的组合注解(如 @RestController代替 @Controller+@ResponseBody)
    • 避免重复注解(如同时使用 @Component和 @Service)
  3. Lombok 规范
    • 实体类统一使用 @Data + @Builder
    • 禁用无约束的 @AllArgsConstructor
  4. 事务控制
    • Service 层统一声明 @Transactional(readOnly = true)
    • 写操作显式指定 @Transactional(rollbackFor = Exception.class)
  5. 测试隔离
    • 单元测试使用 Mockito + JUnit5
    • 集成测试按需选择 @WebMvcTest或 @DataJpaTest

通过系统化的注解对比与组合使用,可显著提高代码规范性和团队协作效率。建议结合 SonarLint 等代码质量管理工具,确保注解使用的合理性与一致性。

目录

  1. Java 常用注解扩展对比
  2. 一、@Controller 与 @RestController 对比
  3. 二、使用 @Data 与 不使用 @Data 对比
  4. 三、使用 @TableName 与 不使用 @TableName 对比
  5. 四、依赖注入注解对比
  6. 五、Spring MVC 参数绑定注解对比
  7. 六、JPA/Hibernate 映射注解对比
  8. 七、Spring Boot 配置注解对比
  9. 八、Lombok 注解对比
  10. 九、事务管理注解对比
  11. 十、测试相关注解对比
  12. 综合对比总结表
  13. 最佳实践建议
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 高性能开发实战:Redis 7 持久化机制详解
  • Java 核心基础:深入理解 Spring IoC 容器与依赖注入
  • 从 ChatGPT 到 AIGC:智能创作与应用赋能深度解析
  • C语言算法练习:从两数之和到寻找峰值
  • AI 绘画技术解析与商业化变现实战指南
  • Python 函数核心概念与实战指南
  • 即答侠 InterviewAssistant 技术解析:AI 面试辅助与简历优化实战
  • Python+Matplotlib 大数据可视化高效解决方案
  • Node.js + uni-app 运动健康 App 计算机毕业设计
  • StructBERT-Large 实战教程:单句对多句批量检索模式扩展开发指南
  • OpenClaw 架构原理与实战部署指南
  • Vue3 + Python 体育赛事发布与在线购票选座系统设计
  • DeepSeek 结合通义万相实现 AI 视频高效制作
  • 多旋翼无人机电源系统详解
  • AI 绘画工作台:Z-Image-Turbo 云端协作部署指南
  • 使用 Trae IDE 将 Figma 设计稿转化为前端代码的技术解析与实践
  • C++ STL list 容器特性与底层原理
  • Android 旅游指南应用构建教程
  • Z-Image-Turbo_Sugar 脸部 Lora 模型快速部署与使用教程
  • AI 无人机智慧巡检平台:20+ 场景智能识别与全流程管理

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online