自学内容网 自学内容网

(十六)JavaWeb后端开发——Spring框架常见注解

目录

1.@Controller

2.@Requestbody

3.@RequestMapping

4.@Component

5.@Autowired & @Resource

6.@ApiOperation

7.@Slf4j


1.@Controller

在 JavaWeb 开发中,@Controller是 Spring 框架中的一个注解,主要用于定义控制器类(Controller),是 Spring MVC 模式的核心组件之一。它表示该类是一个 Spring MVC 控制器,用来处理 HTTP 请求并返回相应的视图或数据。

@Controller 的典型用法:

  • @Controller:将 UserController 类标记为控制器,Spring 会自动扫描该类并将其作为处理 HTTP 请求的组件
  • @RequestMapping("/users"):设置基础路径 /users,该路径会应用到类中的所有方法
  • @GetMapping("/list"):表示处理 GET 请求,路径为 /users/list,并返回一个名为 userList 的视图
  • @GetMapping("/{id}"):通过路径变量({id})接收动态路径部分并返回视图
  • Model:用于在控制器方法中传递数据到视图。model.addAttribute("users", users)users 数据传递到视图中 
@Controller
@RequestMapping("/users")
public class UserController {

    // 假设我们有一个 User 类
    public static class User {
        private String name;
        private int age;

        // getters and setters
    }

    // 显示用户列表页面
    @GetMapping("/list")
    public String showUsers(Model model) {
        List<User> users = new ArrayList<>();
        users.add(new User("Alice", 30));
        users.add(new User("Bob", 25));
        model.addAttribute("users", users); // 将数据传递给视图
        return "userList"; // 返回视图名称
    }

    // 显示用户详情页面
    @GetMapping("/{id}")
    public String showUser(@PathVariable("id") int id, Model model) {
        User user = new User("Charlie", 35); // 假设从数据库获取用户
        model.addAttribute("user", user);
        return "userDetail"; // 返回视图名称
    }
}

2.@Requestbody

在 Java Web 开发中,@RequestBody 是 Spring 框架中的一个注解,主要用于将 HTTP 请求的请求体(request body)映射为方法的参数。

具体来说就是,@RequestBody 注解会将 HTTP 请求的正文部分(通常是 JSON 或 XML 格式的数据)自动转换为 Java 对象。例如,当客户端发送一个包含 JSON 数据的 POST 请求时,Spring 会将这些 JSON 数据反序列化成 Java 对象,如下所示,接收一个 JSON 格式的请求体,并将其转换为 Java 对象:

@RestController
public class UserController {

    // 假设我们有一个 User 类
    public static class User {
        private String name;
        private int age;

        // getters and setters
    }

    @PostMapping("/users")
    public String createUser(@RequestBody User user) {
        // 自动将请求体中的 JSON 数据转换成 User 对象
        return "User created: " + user.getName() + ", age: " + user.getAge();
    }
}

解析:

  • @RequestBody:它会将 HTTP 请求的 Body 部分转换为方法参数。在这个例子中,它会将客户端发送的 JSON 数据映射到 User 类对象的字段上
  • @PostMapping("/users"):这个注解表示一个 POST 请求,客户端通过请求体发送一个用户信息(如 JSON 格式),Spring 会自动解析这个请求体,并使用 @RequestBody 注解将其转换成 User 对象

如果客户端发送以下JSON数据:

{
  "name": "John Doe",
  "age": 30
}

那么在 createUser 方法中,user 对象会被自动填充为:

user.name = "John Doe";
user.age = 30;

3.@RequestMapping

@RequestMapping 是 Spring 框架中用于处理 HTTP 请求的核心注解之一。它可以用于类级别和方法级别,标识一个方法或类与特定的 HTTP 请求(如 GET、POST、PUT、DELETE)映射关系,从而让 Spring 框架能够将 HTTP 请求路由到对应的处理方法。

Spring 为 @RequestMapping提供了更具体的注解,用于简化 @RequestMapping 的使用:

  •  @GetMapping:专门用于处理 GET 请求
  • @PostMapping:专门用于处理 POST 请求
  • @PutMapping:专门用于处理 PUT 请求
  • @DeleteMapping:专门用于处理 DELETE 请求
  • @PatchMapping:专门用于处理 PATCH 请求 

 这些注解是 @RequestMapping 的快捷方式,适用于常见的 HTTP 请求方法,减少了代码的冗余

@RequestMapping 的使用示例:类级别和方法级别的结合使用

  •  @RequestMapping("/users"):在类级别指定基本的 URL 路径 /users,该路径会应用到类中的所有方法 
  • @GetMapping@PostMapping@RequestMapping 的快捷方式,分别处理 GETPOST 请求 
@RestController
@RequestMapping("/users")
public class UserController {

    // 处理 GET 请求,路径为 "/users"
    @GetMapping
    public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();
        users.add(new User("Alice", 30));
        users.add(new User("Bob", 25));
        return users;  // 返回用户列表,默认会转化为 JSON
    }

    // 处理 POST 请求,路径为 "/users"
    @PostMapping
    public User createUser(@RequestBody User user) {
        return user;  // 接收 JSON 数据并返回创建的用户对象
    }
}

4.@Component

在 Java Web 开发中,@Component 注解是 Spring 框架提供的一个非常重要的注解,用来声明一个类是 Spring 容器中的一个组件,使得该类的实例可以被自动注册到 Spring 容器中进行管理。这样,你就可以利用 Spring 提供的依赖注入(DI)功能,将该组件注入到其他类中,以下是@Component 注解使用步骤:

1.@Component 声明

@Component 通常用于类的声明上,表示该类是一个 Spring 管理的 Bean:

import org.springframework.stereotype.Component;

@Component
public class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

2.Spring scan扫描

Spring 默认会扫描带有 @Component 注解的类(以及其他派生注解,如 @Service@Repository@Controller 等),并将其注册为 Spring 管理的 Bean。为了让 Spring 知道去扫描这些组件,通常会在配置类中使用 @ComponentScan 注解指定包扫描路径

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.example") // 指定要扫描的包
public class AppConfig {
    // Spring 会自动扫描并注册包中的 @Component 注解的类
}

3.自动装配

使用 @Autowired 注解可以将 @Component 注解的类实例注入到其他类中:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyController {

    @Autowired
    private MyService myService;

    public void startProcess() {
        myService.doSomething();
    }
}

@Service@Repository@Controller 都是 @Component 的派生注解,它们与 @Component 有相同的功能,但用于不同的层次:

  • @Service:通常用于业务层服务类
  • @Repository:通常用于数据访问层类
  • @Controller:通常用于控制器类(用于 MVC 控制器)
  • @Component:用于普通的 Bean 类

5.@Autowired & @Resource

@Autowired和@Resource都是用于依赖注入(DI)的注解,但是@Autowired注解是Spring框架提供的注解,它根据类型进行自动装配;@Resource注解是JavaEE提供的注解,它提供了更灵活的方式进行依赖对象的查找,可以按照名称或类型进行注入

@Component
public class UserService {
    @Autowired
    private User user;
}

@Component
public class UserService {
    @Resource
    private User user;
}

在上述示例中,使用@Autowired注解将User对象注入到UserService类中,Spring容器会根据UserRepository类型进行自动装配,并将匹配的Bean注入到user字段中;@Resource注解默认按照字段名进行依赖对象的查找和匹配,也可以通过name属性指定依赖对象的名称,它们的区别是: 

  • @Autowired注解是Spring提供的,用于自动装配Bean依赖。它可以通过类型匹配来自动注入依赖对象,但如果存在多个符合条件的候选对象时,默认使用byType的方式进行自动装配
  • @Resource注解是JavaEE提供的,也可以用于自动装配依赖对象。它可以通过名称匹配来自动注入依赖对象,默认使用byName的方式进行自动装配

其他JavaWeb开发常见注解:17.1 JavaWeb-常用注解_java web 判断请求参数注解-CSDN博客

6.@ApiOperation

@ApiOperation 是一个常用于 Java 后端开发中 Swagger 文档生成工具的注解,通常用于描述和说明 API 的接口操作,从而可以展示在localhost:80/doc.html中

@PostMapping("/status/{status}")
@ApiOperation("启用禁用员工账号")
public Result startOrStop(@PathVariable("status") Integer status, Long id){
    employeeService.startorstpp(status,id);
    return Result.success();
}

7.@Slf4j

@Slf4j 是一个 Lombok 提供的注解,用于简化日志记录的代码。使用它可以自动生成一个 org.slf4j.Logger 类型的 log 对象,让我们在类中直接使用 log 进行日志输出(log.info),而不需要手动定义 Logger 对象。假设我们有一个类 MyClass,在没有 Lombok 时我们通常会这样写:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {
    private static final Logger log = LoggerFactory.getLogger(MyClass.class);

    public void doSomething() {
        log.info("Doing something...");
    }
}

使用 @Slf4j 后可以简化为:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyClass {

    public void doSomething() {
        log.info("Doing something...");
    }
}


原文地址:https://blog.csdn.net/mzz715/article/details/143734063

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!