当前位置: 首页 > article >正文

【Java 常用注解学习笔记3】——Java 常用注解扩展与完善

Java 常用注解扩展与完善


一、Spring MVC 注解补充与对比
1. @RestController@Controller 核心区别
注解作用返回值处理适用场景
@Controller标记为Web控制器返回视图名称(配合模板引擎)传统MVC架构(如JSP/Thymeleaf)
@RestController@Controller + @ResponseBody 的组合直接返回JSON/XML数据(无需视图解析器)RESTful API开发
代码对比示例
// 传统Controller返回视图
@Controller
@RequestMapping("/web")
public class WebController {
    @GetMapping("/user")
    public String userPage(Model model) {
        model.addAttribute("user", new User());
        return "user"; // 返回视图名 user.html
    }
}
// RESTful接口返回JSON
@RestController
@RequestMapping("/api")
public class ApiController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id); // 自动转为JSON
    }
}
2. @RequestMapping 派生注解
注解等效写法HTTP方法示例
@GetMapping@RequestMapping(method=GET)GET@GetMapping("/users")
@PostMapping@RequestMapping(method=POST)POST@PostMapping("/users")
@PutMapping@RequestMapping(method=PUT)PUT@PutMapping("/users/{id}")
@DeleteMapping@RequestMapping(method=DELETE)DELETE@DeleteMapping("/users/{id}")
@PatchMapping@RequestMapping(method=PATCH)PATCH@PatchMapping("/users/{id}")
最佳实践:优先使用具体方法注解(如 @GetMapping)而非通用 @RequestMapping,提升代码可读性。

二、Swagger 注解扩展
1. @Api 注解详解
参数作用示例
tags接口分组(显示在Swagger UI侧边栏)@Api(tags = "用户管理模块")
value接口组描述(已弃用,推荐用tags@Api(value = "用户管理接口")
hidden隐藏整个控制器@Api(hidden = true)
完整Swagger配置示例
@Api(tags = "订单管理接口")
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    @ApiOperation("创建订单")
    @PostMapping
    public ResponseEntity<Order> createOrder(
        @ApiParam(value = "订单数据", required = true)
        @RequestBody OrderCreateDTO dto) {
        // ...
    }
    @ApiOperation("删除订单")
    @DeleteMapping("/{orderId}")
    public ResponseEntity<Void> deleteOrder(
        @ApiParam(value = "订单ID", example = "123")
        @PathVariable String orderId) {
        // ...
    }
}
2. Swagger 其他核心注解
注解作用示例
@ApiIgnore隐藏特定方法或参数@ApiIgnore @RequestParam String token
@ApiResponse定义接口响应状态码说明@ApiResponse(code=404, message="Not Found")
@ApiImplicitParam描述非实体类参数用于GET请求参数说明

三、其他常用注解补充
1. Spring 依赖注入对比
注解来源注入方式推荐场景
@AutowiredSpring按类型注入优先使用构造器注入
@ResourceJSR-250按名称注入(默认)需要明确指定Bean名称时
@InjectJSR-330@Autowired需搭配其他DI框架使用
构造器注入最佳实践
@Service
public class UserService {
    private final UserDao userDao;
    
    // 显式声明构造器注入
    @Autowired
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}
2. JPA 主键生成策略
注解生成策略示例
@GeneratedValue主键生成策略@GeneratedValue(strategy=GenerationType.IDENTITY)
策略类型
GenerationType.AUTO自动选择(默认)适合多数据库兼容
GenerationType.IDENTITY自增列(MySQL)依赖数据库自增机制
GenerationType.SEQUENCE序列(Oracle)需创建序列对象
GenerationType.TABLE通过表模拟序列通用性强但性能较低
复合主键示例
@Entity
public class OrderItem {
    @EmbeddedId
    private OrderItemPK id; // 复合主键类
    
    // 其他字段...
}
@Embeddable
public class OrderItemPK implements Serializable {
    private Long orderId;
    private Long productId;
}
3. Lombok 进阶注解
注解作用示例
@Value生成不可变对象(所有字段final)@Value public class Point { int x, y; }
@NonNull自动生成非空检查public void setName(@NonNull String name)
@Cleanup自动资源管理(如关闭流)@Cleanup InputStream is = new FileInputStream(...)
@Value 与 @Data 对比
@Data 
public class User {
    private Long id;    // 生成setter/getter
    private String name;
}
@Value 
public class ImmutableUser {
    private Long id;    // 字段自动为final
    private String name;// 只生成getter
}

四、Spring Boot 配置相关注解
1. 配置注入对比
注解作用示例
@Value注入单个配置项@Value("${app.timeout}") private int timeout;
@ConfigurationProperties批量绑定配置到对象@ConfigurationProperties(prefix="app")
YAML 配置示例
app:
  datasource:
    url: jdbc:mysql://localhost:3306/db
    username: root
    password: 123456
  timeout: 30

配置类绑定

@Configuration
@ConfigurationProperties(prefix = "app.datasource")
@Validated
public class DataSourceConfig {
    @NotBlank
    private String url;
    @Min(1)
    private int maxPoolSize;
    // getters/setters
}
2. 条件装配注解
注解生效条件典型场景
@ConditionalOnProperty配置文件中存在指定属性功能开关控制
@ConditionalOnClassClasspath中存在指定类自动配置第三方库
@ConditionalOnMissingBean容器中不存在指定Bean避免重复注册
示例
@Configuration
@ConditionalOnClass(RedisTemplate.class)
public class RedisAutoConfig {
    @Bean
    @ConditionalOnMissingBean
    public RedisTemplate<String, Object> redisTemplate() {
        return new RedisTemplate<>();
    }
}

五、高频相似注解对比总结
注解组区别点
@Component vs @Bean@Component 标注类,@Bean 标注方法;后者用于导入第三方库组件
@Import vs @ComponentScan@Import 直接导入配置类,@ComponentScan 扫描包路径
@RequestParam vs @PathVariable前者获取URL参数,后者获取URI模板变量
@Transactional 与 JPA/HibernateSpring注解支持更丰富的事务传播行为,JPA注解需结合EntityManager使用

通过系统化分类与对比,开发者可以更精准地选择适合业务场景的注解组合,提升代码质量与开发效率。建议根据项目架构(如传统MVC或RESTful API)合理选用 @Controller/@RestController,并注意Swagger注解的规范性以保障API文档的可维护性。


http://www.kler.cn/a/562071.html

相关文章:

  • MySQL 数据库基础详细解释和示例
  • 数据结构之【链表简介】
  • vi 编辑器的使用
  • DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库
  • Web前端开发——HTML基础
  • Cassini_Network-Aware Job Schedulingin Machine Learning Clusters
  • 【【Systemverilog学习参考 简单的加法器验证-含覆盖率】】
  • unity学习51:所有UI的父物体:canvas画布
  • 鸿蒙5.0实战案例:har和hsp的转换
  • “深入解析 SQL Server 子查询:从基础到应用”
  • 安全开发-环境选择
  • AGI分级探索:从OpenAI到DeepMind,展望未来AI图景
  • Ubuntu从零创建Hadoop集群
  • idea里的插件spring boot helper 如何使用,有哪些强大的功能,该如何去习惯性的运用这些功能
  • IO进程 day06
  • Kafka 消费者组内分区分配策略 以及 管理控制台方案
  • 巨控科技的GRM550元出魔抗实现PLC远程下载与维护方案:工业自动化的高效解决方案
  • 图扑农牧林数据分析可视化平台:智慧农业的“数字大脑”
  • 协方差(Covariance)与得分函数:从Fisher信息矩阵看统计关联
  • 互联网医院系统源码解析:如何开发智能化的电子处方小程序?