Java注解详解
注解(Annotation)是Java5引入的一种元数据形式,提供了一种向代码添加结构化元数据的方式。注解本身不影响代码逻辑,但可以被编译器、开发工具或运行时环境读取并做相应处理
注解的基本概念
- 定义:注解是一种代码级别的说明,与类、接口、枚举在同一层次
- 语法:以
@注解名形式存在,可附加在包、类、字段、方法等元素上 - 本质:注解本身只是标记,其功能由框架通过反射实现
注解的主要用途
- 编写文档:通过代码里的元数据生成文档
- 代码分析:静态分析工具使用3
- 编译检查:如
@Override确保方法正确重写 - 运行时处理:框架如Spring、Hibernate使用
- 我上学学的就是Hibernate,结果毕业市场很少用,结果嘛找不到工作,失业了我
- 现在用Spring框架,又有人说Java不行了,ai直接让程序员原地失业
头疼
Java内置常用注解
@Override:标记方法重写 接口实现类经常使用@SuppressWarnings:抑制编译器警告,非常好用,老板不让报警告,我tm一个注解下去@FunctionalInterface:标记函数式接口,我记得就是只有是Java 8引入的核心特性之一,指只包含一个抽象方法的接口(可以有多个默认方法或静态方法)。是Lambda表达式和方法引用的基础,使Java支持函数式编程范式.Lambda表达式可以接(话)化,口音太重了,输入法搞不明白.关于Lambda表达式我会在后续文章中写,这里就不聊了
注解作用
下面我介绍注解作用来源: 主要是我开发碰见的 这部分在Controller层
@RestController是Spring框架中用于构建RESTful Web服务的关键注解,以下是其核心特性和用法详解:
- 组合注解:`@RestController`是`@Controller`和`@ResponseBody`的组合,由Spring 4.0引入12。
- 作用:标记类为控制器,并自动将方法返回值序列化为JSON/XML等格式,直接写入HTTP响应体(无需视图解析) `
- 我了哇,写在controller层:`Controller`不再直接实例化`Service`,而是通过接口依赖,实现层间解耦
`@Autowired`是Spring框架中实现依赖注入(DI)的核心注解
-
- 自动装配:根据类型(byType)自动将Spring管理的Bean注入到目标字段、构造器或方法中。
- 解耦与简化:消除手动创建依赖对象的代码,降低组件间的耦合度
呐,这个是例子,通过依赖注入(DI)和控制反转(IoC)可以实现软件架构的松耦合和高内聚
@Service
public class UserService {
@Autowired // 直接注入UserDao实例
private UserDao userDao;
}
@RequestMapping("/clazzs")
是一个用于映射HTTP请求路径到控制器方法的注解。以下是关于该注解的详细解析:
类级别注解定义基础路径,方法级别注解定义具体端点
3. 扩展特性
- 支持通过`method`参数指定HTTP方法(GET/POST等)
- 可与`@GetMapping`、`@PostMapping`等组合注解配合使用
- 支持路径变量和参数绑定等高级特性
4. 实现原理
- 基于Java反射机制,运行时通过扫描注解建立URL与方法的映射关系
- 需要配合`@Controller`或`@RestController`注解使用
注意:实际开发中建议使用Spring Boot提供的`@RestController`+`@GetMapping`等组合注解,
可使代码更简洁
`@GetMapping` 是 Spring MVC 中用于处理 HTTP GET 请求的专用注解,属于 Spring 提供的请求映射注解之一。以下是详细解析:
1. 核心特性
- 功能定位:`@GetMapping` 是 `@RequestMapping(method = RequestMethod.GET)` 的简写形式,
专门用于处理 GET 请求。
- 语义明确:相比通用注解 `@RequestMapping`,`@GetMapping` 直接表明方法仅响应 GET 请求,
提升代码可读性。
- 组合使用 :可与类级别的 `@RequestMapping` 结合,
形成层级路径映射(如类路径为 `/api`,方法路径为 `/users`,则完整路径为 `/api/users`
@DeleteMapping("/{id}")
`@DeleteMapping("/{id}")`是Spring框架中用于处理HTTP DELETE请求的注解,主要应用于RESTful API设计。以下是关键解析:
### 1. 核心功能
- 专用于映射删除操作的HTTP DELETE请求,是`@RequestMapping(method = RequestMethod.DELETE)`的简写形式24。
- `{id}`为路径变量(Path Variable),表示动态资源标识符,例如删除指定ID的用户:`/users/123`14。
### 2. 参数绑定方式
- 路径变量通过`@PathVariable`注解获取,支持类型自动转换(如`Long`、`String`等):
@DeleteMapping("/users/{id}")
public ResponseEntity<String> deleteUser(@PathVariable Long id) {
// 删除逻辑
return ResponseEntity.ok("Deleted ID: " + id);
}
若变量名与占位符一致可省略参数名(如`@PathVariable Long id`)。
### 3. 前端调用示例
- Axios请求:
axios.delete(`/api/users/${id}`)
.then(response => console.log(response.data))
.catch(error => console.error(error));
需将`id`动态拼接至URL
### 4. 应用场景
- 适用于RESTful架构中资源的删除操作,如:
- 删除用户:`DELETE /users/{id}`
- 删除订单:`DELETE /orders/{orderId}`。
### 5. 注意事项
- 与`@PutMapping`区别:PUT用于替换资源整体,DELETE仅移除资源。
- 默认返回状态码为200(成功),若资源不存在可返回404。
通过此注解可简洁高效地实现资源删除接口,符合RESTful设计原则
@PostMapping是Spring框架中用于处理HTTP POST请求的核心注解,其核心特性和用法如下:
1. 基础定义 专用于映射POST请求的快捷注解,
等价于@RequestMapping(method = RequestMethod.POST)的简写形式。
通常用于RESTful API中创建资源的场景(如新增用户、提交订单等)
我觉得意思相近于new新建新增
以下是关于`@PathVariable("id")`的详细解析,结合RESTful开发中的常见用法和注意事项:
### 1. **基础定义**
- 用于从URL路径模板中提取动态参数,标注在方法参数前,显式绑定名为`id`的路径变量12。
- 典型应用场景:RESTful API中通过资源ID定位唯一实体(如`/users/{id}`)27。
### 2. **核心特性**
- **变量名匹配**:
当注解指定名称(如`@PathVariable("id")`),Spring严格匹配URL中的`{id}`占位符,与参数名无关46。
示例:
```
javaCopy Code
@GetMapping("/products/{id}")
public Product getProduct(@PathVariable("id") Long productId) {
// 即使参数名为productId,仍绑定URL中的{id}
}
```
- **类型转换**:
自动将路径中的字符串值转换为方法参数类型(如`String`→`Long`),若转换失败抛出`TypeMismatchException`58。
### 3. **使用对比**
| **场景** | **写法** | **说明** |
| ---------- | --------------------------------- | --------------------------- |
| 变量名与参数名一致 | `@PathVariable Long id` | 可省略注解内的名称声明,Spring自动按名称匹配56 |
| 变量名与参数名不一致 | `@PathVariable("id") Long prodId` | 必须显式指定名称,否则绑定失败46 |
| 可选路径变量 | `@PathVariable(required=false)` | 非必需参数需明确标注,否则缺失时报404错误5 |
### 4. **实际应用示例**
- **多级路径绑定**:
```
javaCopy Code
@DeleteMapping("/departments/{deptId}/employees/{empId}")
public void deleteEmployee(
@PathVariable("deptId") String departmentId,
@PathVariable("empId") Long employeeId
) {
// 同时提取部门ID和员工ID
}
```
- **RESTful资源操作**:
```
javaCopy Code
@PutMapping("/books/{id}")
public ResponseEntity<Book> updateBook(
@PathVariable("id") String bookId,
@RequestBody Book book
) {
// 根据ID更新书籍信息
}
```
### 5. **注意事项**
- **必填性**:默认要求路径变量必须存在(`required=true`),若允许缺失需显式设置为`false`58。
- **编码规范**:建议URL中的`{id}`命名与业务语义一致(如`userId`、`orderId`),提升可读性27。
该注解通过精准绑定URL动态参数,成为Spring MVC实现RESTful架构的核心组件之一
# @RequestBody 注解详解
## 1. 基本定义与核心功能
`@RequestBody` 是 Spring 框架提供的核心注解,用于将 HTTP 请求体中的数据(如 JSON、XML)反序列化为 Java 对象34。主要特点包括:
- 属于 `org.springframework.web.bind.annotation` 包,首次发布于 Spring 3.03
- 通过消息转换器(如 `MappingJackson2HttpMessageConverter`)实现自动类型转换
- 适用于 POST/PUT 等包含请求体的 HTTP 方法
## 2. 使用场景与典型配置
### 主要应用场景
- 接收前端发送的 JSON 格式数据
- 处理复杂数据结构(如嵌套对象、集合)
- RESTful API 开发中创建/更新资源
### 基础用法示例
{
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user)
{
// 自动将JSON转换为User对象
return ResponseEntity.ok(userService.save(user));
}
}