【Java常用注解学习笔记4】——Java 常用注解扩展对比

【Java常用注解学习笔记4】——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(默认)
代码示例```java```java
@Controller@RestController
public class WebCtrl {public class ApiCtrl {
@GetMapping(“/page”)@GetMapping(“/data”)
public String page() {public User data() {
return “index”; // 返回视图名return userService.findUser(); // 自动转JSON
}}
}}

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

对比维度使用 @Data不使用 @Data
代码量自动生成以下方法:
- 所有字段的getter/setter
- toString()
- equals()/hashCode()
需手动编写所有方法
维护性字段增减时无需修改方法字段变更需同步修改相关方法
继承关系处理需显式添加 @EqualsAndHashCode(callSuper=true) 包含父类字段手动编写时可直接控制是否包含父类字段
框架兼容性依赖Lombok插件(需IDE支持)无额外依赖
代码示例```java```java
@Datapublic class User {
public class User {private Long id;
private Long id;private String name;
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默认规则映射:
类名驼峰转下划线(如 SysUsersys_user
适用场景1. 表名含特殊字符(如 user-info
2. 类名与表名无对应关系
类名与表名严格遵循驼峰转下划线规则
全局配置覆盖优先级高于全局配置可通过配置文件统一设置表名前缀:
mybatis-plus.global-config.db-config.table-prefix=sys_
代码示例```java```java
@Data@Data
@TableName(“sys_user”) // 显式指定表名public class SysUser { // 默认映射为 sys_user
public class User {private Long id;
private Long id;}
}

注意事项

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

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

代码示例

// @Autowired + @Qualifier@Autowired@Qualifier("mysqlDataSource")privateDataSource dataSource;// @Resource@Resource(name ="oracleDataSource")privateDataSource dataSource;

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

代码示例

// PathVariable@GetMapping("/users/{id}")publicUsergetUser(@PathVariableLong id){...}// RequestBody@PostMapping("/users")publicResponseEntity<?>createUser(@RequestBodyUserDTO userDTO){...}

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

代码示例

@Entity@Table(name ="departments")publicclassDepartment{@OneToMany(mappedBy ="department")privateList<Employee> employees;}@EntitypublicclassEmployee{@ManyToOne@JoinColumn(name ="dept_id")privateDepartment department;}

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

配置示例

# application.ymlapp:security:enabled:truetimeout:300

代码实现

@Configuration@ConfigurationProperties(prefix ="app.security")publicclassSecurityConfig{privateboolean enabled;privateint timeout;// getters/setters}

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

代码示例

@Value@BuilderpublicclassImmutablePoint{privatefinalint x;privatefinalint y;}// 使用ImmutablePoint point =ImmutablePoint.builder().x(10).y(20).build();

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

代码示例

@ServicepublicclassUserService{@TransactionalpublicvoidupdateUser(User user){ userRepository.save(user);}}@RepositorypublicinterfaceUserRepositoryextendsJpaRepository<User,Long>{@Modifying@Query("UPDATE User u SET u.name = ?1 WHERE u.id = ?2")intupdateNameById(String name,Long id);}

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

测试示例

// 全集成测试@SpringBootTestclassUserServiceIntegrationTest{@AutowiredprivateUserService userService;}// 控制层测试@WebMvcTest(UserController.class)classUserControllerTest{@MockBeanprivateUserService userService;@AutowiredprivateMockMvc 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等代码质量管理工具,确保注解使用的合理性与一致性。

Read more

【AI绘画】Midjourney进阶:色调详解(上)

【AI绘画】Midjourney进阶:色调详解(上)

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: AI绘画 | Midjourney 文章目录 * 💯前言 * 💯Midjourney中的色彩控制 * 为什么要控制色彩? * 为什么要在Midjourney中控制色彩? * 💯色调 * 白色调 * 淡色调 * 明色调 * 💯小结 💯前言 【AI绘画】Midjourney进阶:色相详解     https://blog.ZEEKLOG.net/2201_75539691?type=blog 在上一篇文章中,我们详细探讨了色相的基本概念和运用。而色相作为色彩的基础,虽然能帮助我们区分颜色的种类,但它并不能完全满足实际创作中的需求。尤其在 AI绘画中,颜色的呈现往往需要更加精细的调控,颜色的表达也需要超越单纯的“色相”维度。例如,当我们谈到蓝色时,仅仅知道它是蓝色并不足够。在不同的创作场景中,蓝色可以呈现为淡蓝、深蓝、灰蓝或纯蓝等多种形式,而每一种形式都能传递不同的氛围与视觉感受。 对这些变化的理解与运用,其实是对色调的掌握。色调可以看作是颜色的性格特征,

By Ne0inhk
如何将代码轻松上传到 Gitee?Git 使用全攻略!

如何将代码轻松上传到 Gitee?Git 使用全攻略!

在开发过程中,代码托管平台是每个开发者的必备工具。无论你是刚接触版本控制的新手,还是已经拥有多项目管理经验的程序员,掌握如何将代码上传到 Gitee 或 GitHub 都是必不可少的技能。 今天,我将带你一步步了解 如何将项目上传到 Gitee,并且在过程中顺便深入解析 Git、Gitee 和 GitHub 的关系,让你在使用这些工具时不再迷茫。 一、准备工作:Git 基础知识 首先,我们需要知道 Git 是什么,它是如何与 Gitee 和 GitHub 配合使用的。 1.1 什么是 Git? Git 是一款开源的分布式版本控制工具,旨在帮助程序员管理代码历史、团队协作以及代码合并。无论你是一个人开发项目,还是和团队一起协作,Git 都能帮助你: * 跟踪代码的更改 * 回退到任何历史版本 * 合并团队成员的修改 1.2

By Ne0inhk
GitHub 寻宝指南:四种高效发现优质开源项目的方法

GitHub 寻宝指南:四种高效发现优质开源项目的方法

文章目录 * 引言:从“收藏家”到“寻宝猎人”,升级你的 GitHub 发现技能 * 方法一:利用 GitHub 自身的功能(基础) * 1. GitHub Explore (探索) * 2. GitHub 高级搜索 * 方法二:借助社区整理的精选列表(高效) * 1. Awesome Lists * 2. 关注领域专家 * 方法三:善用第三方辅助网站(多维) * 1. Star History * 2. LibHunt * 方法四:拥抱 AI 进行智能搜索(前沿) * GitHub 的 AI 搜索 (Ask Copilot) * 实战演示: * 结语:

By Ne0inhk