@RestController
@RestController
是 Spring 框架中用来标注一个类为 RESTful Web服务控制器 的注解。它是 @Controller
和 @ResponseBody
的组合,主要用来处理 HTTP 请求并返回数据而不是视图。
作用与特点:
- 定义控制器类将类标记为一个控制器,用于接收和处理 HTTP 请求。
- 自动将返回值转换为 JSON/XML:
@RestController
自动将控制器方法的返回值序列化为 JSON 或 XML 格式,通过 HTTP 响应返回给客户端。
- 这是因为它隐含了 @ResponseBody 注解。
- 简化代码无需在每个方法上显式使用
@ResponseBody
,整个类的所有方法默认都将返回数据而不是视图。
常见用法:
1 | import org.springframework.web.bind.annotation.GetMapping; |
示例解析:
/api/hello 返回的是字符串 “Hello, World!”,被序列化为 HTTP 响应体。
/api/user 返回的是 User 对象,会自动被序列化为 JSON,例如:
1
2
3
4
5{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}等效写法:
如果使用@Controller
,需要配合@ResponseBody
,代码会显得冗长:
1 |
|
总结:@RestController
适用于构建 RESTful API,简化开发流程,是 Spring Web 的重要注解之一。如果你的控制器方法大部分是返回数据而不是视图,使用 @RestController
会非常方便。
@Data 注解
作用: 自动生成以下方法:Getter 和 Setter 方法(为所有成员变量)toString() 方法equals() 和 hashCode() 方法canEqual() 方法(用于子类验证)
优势: 减少手写 Getter、Setter 等方法的繁琐代码。
等效代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public class Result {
private String code;
private String msg;
private T data;
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
public String getMsg() { return msg; }
public void setMsg(String msg) { this.msg = msg; }
public T getData() { return data; }
public void setData(T data) { this.data = data; }
public String toString() {
return "Result{" +
"code='" + code + '\'' +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
public boolean equals(Object o) {
// equals 方法实现
}
public int hashCode() {
// hashCode 方法实现
}
}
@AllArgsConstructor注解
作用: 自动生成一个包含所有成员变量的构造方法。
生成的代码:
1
2
3
4
5public Result(String code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}用途: 方便在创建对象时直接初始化所有属性。例如:
1
Result result = new Result<>("0", "成功", "数据");
@NoArgsConstructor 注解
作用: 自动生成一个无参构造方法。
生成的代码:
1
public Result() {}
用途: 提供无参构造器支持,例如需要通过反射或框架(如 Spring)创建对象时。
1
Result result = new Result<>();
@Resource注解
@Resource
是 Java 中用于依赖注入的一个注解,它主要用于自动装配资源(如 Bean 或组件),在 Java EE(现在的 Jakarta EE)和 Spring 等框架中得到广泛使用。该注解通常用于标记成员变量、方法或构造函数,指示容器(如 Spring 或应用服务器)需要自动注入指定的资源。
主要特性:
自动注入:@Resource 自动装配资源,可以通过名称或类型来注入。
名称默认匹配:@Resource 默认根据字段名或方法名来进行资源名称匹配。如果没有找到匹配的名称,它会根据类型来注入。
可以用于字段、方法、构造函数:可以用于类的成员变量(字段)、setter 方法或构造函数。
使用示例:
1. 注入字段:
1 | import javax.annotation.Resource; |
在这个例子中,@Resource
注解会根据 dataSource
字段的名称自动注入一个 DataSource
类型的资源。
2. 注入方法:
1 | import javax.annotation.Resource; |
在这个例子中,@Resource
注解被用在了 setter 方法上,容器会自动注入所需的 DataSource
。
3. 注入构造函数:
1 | import javax.annotation.Resource; |
在这个例子中,@Resource
注解应用于构造函数,自动注入 DataSource
。
注解的属性:
name:指定资源的名称,用于自定义资源名称的匹配。例如:@Resource(name=”myDataSource”)
type:指定资源的类型,通常不需要显式设置,容器会根据字段的类型自动注入。
与 @Autowired 比较:
@Autowired 是 Spring 框架提供的注解,它主要通过类型来进行依赖注入。与 @Resource 注解相比,@Autowired 主要依据类型进行注入,并且在没有找到唯一匹配的 Bean 时会抛出异常,除非配合 @Qualifier 使用指定 Bean 名称。
@Resource 默认通过名称进行注入,只有在没有找到合适的名称匹配时才会通过类型来进行匹配。