Java 常用注解扩展与完善
一、Spring MVC 注解补充与对比
1. @RestController
与 @Controller
核心区别
注解 | 作用 | 返回值处理 | 适用场景 |
---|
@Controller | 标记为Web控制器 | 返回视图名称(配合模板引擎) | 传统MVC架构(如JSP/Thymeleaf) |
@RestController | @Controller + @ResponseBody 的组合 | 直接返回JSON/XML数据(无需视图解析器) | RESTful API开发 |
代码对比示例: | | | |
@Controller
@RequestMapping("/web")
public class WebController {
@GetMapping("/user")
public String userPage(Model model) {
model.addAttribute("user", new User());
return "user";
}
}
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
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 依赖注入对比
注解 | 来源 | 注入方式 | 推荐场景 |
---|
@Autowired | Spring | 按类型注入 | 优先使用构造器注入 |
@Resource | JSR-250 | 按名称注入(默认) | 需要明确指定Bean名称时 |
@Inject | JSR-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;
private String name;
}
@Value
public class ImmutableUser {
private Long id;
private String name;
}
四、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;
}
2. 条件装配注解
注解 | 生效条件 | 典型场景 |
---|
@ConditionalOnProperty | 配置文件中存在指定属性 | 功能开关控制 |
@ConditionalOnClass | Classpath中存在指定类 | 自动配置第三方库 |
@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/Hibernate | Spring注解支持更丰富的事务传播行为,JPA注解需结合EntityManager使用 |
通过系统化分类与对比,开发者可以更精准地选择适合业务场景的注解组合,提升代码质量与开发效率。建议根据项目架构(如传统MVC或RESTful API)合理选用 @Controller
/@RestController
,并注意Swagger注解的规范性以保障API文档的可维护性。