0%

Java注解-RestController-Data-AllArgs-NoArgs-Resource

@RestController

@RestController 是 Spring 框架中用来标注一个类为 RESTful Web服务控制器 的注解。它是 @Controller@ResponseBody 的组合,主要用来处理 HTTP 请求并返回数据而不是视图。

作用与特点:

  1. 定义控制器类将类标记为一个控制器,用于接收和处理 HTTP 请求。
  2. 自动将返回值转换为 JSON/XML:@RestController 自动将控制器方法的返回值序列化为 JSON 或 XML 格式,通过 HTTP 响应返回给客户端。
  • 这是因为它隐含了 @ResponseBody 注解。
  1. 简化代码无需在每个方法上显式使用 @ResponseBody,整个类的所有方法默认都将返回数据而不是视图。
    常见用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class MyRestController {

// GET 请求:返回一个简单字符串
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}

// GET 请求:返回一个对象,自动序列化为 JSON
@GetMapping("/user")
public User getUser() {
return new User(1, "Alice", "alice@example.com");
}
}

示例解析:

  1. /api/hello 返回的是字符串 “Hello, World!”,被序列化为 HTTP 响应体。

  2. /api/user 返回的是 User 对象,会自动被序列化为 JSON,例如:

    1
    2
    3
    4
    5
    {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com"
    }

    等效写法:
    如果使用 @Controller,需要配合 @ResponseBody,代码会显得冗长:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Controller
@RequestMapping("/api")
public class MyRestController {

@ResponseBody
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}

@ResponseBody
@GetMapping("/user")
public User getUser() {
return new User(1, "Alice", "alice@example.com");
}
}

总结:@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
    33
    public 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; }

    @Override
    public String toString() {
    return "Result{" +
    "code='" + code + '\'' +
    ", msg='" + msg + '\'' +
    ", data=" + data +
    '}';
    }

    @Override
    public boolean equals(Object o) {
    // equals 方法实现
    }

    @Override
    public int hashCode() {
    // hashCode 方法实现
    }
    }

@AllArgsConstructor注解

  • 作用: 自动生成一个包含所有成员变量的构造方法。

  • 生成的代码:

    1
    2
    3
    4
    5
    public 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
2
3
4
5
6
7
8
9
import javax.annotation.Resource;

public class MyService {

@Resource
private DataSource dataSource;

// 其他代码...
}

在这个例子中,@Resource 注解会根据 dataSource 字段的名称自动注入一个 DataSource 类型的资源。

2. 注入方法:

1
2
3
4
5
6
7
8
9
10
11
import javax.annotation.Resource;

public class MyService {

private DataSource dataSource;

@Resource
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}

在这个例子中,@Resource 注解被用在了 setter 方法上,容器会自动注入所需的 DataSource

3. 注入构造函数:

1
2
3
4
5
6
7
8
9
10
11
import javax.annotation.Resource;

public class MyService {

private DataSource dataSource;

@Resource
public MyService(DataSource dataSource) {
this.dataSource = dataSource;
}
}

在这个例子中,@Resource 注解应用于构造函数,自动注入 DataSource

注解的属性:

  • name:指定资源的名称,用于自定义资源名称的匹配。例如:@Resource(name=”myDataSource”)

  • type:指定资源的类型,通常不需要显式设置,容器会根据字段的类型自动注入。

    与 @Autowired 比较:

  • @Autowired 是 Spring 框架提供的注解,它主要通过类型来进行依赖注入。与 @Resource 注解相比,@Autowired 主要依据类型进行注入,并且在没有找到唯一匹配的 Bean 时会抛出异常,除非配合 @Qualifier 使用指定 Bean 名称。

  • @Resource 默认通过名称进行注入,只有在没有找到合适的名称匹配时才会通过类型来进行匹配。