• Spring Boot 面试题——常用注解


    Spring Bean

    将一个类声明为 Bean

    • @Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用 @Component 注解标注。
    • @Repository:用于标识数据访问层(DAO 层)组件类作为Bean,主要用于数据库相关操作。
    • @Service:用于标识服务层组件类作为 Bean,,主要涉及一些复杂的逻辑,需要用到 Dao 层。
    • @Controller/@RestCpntroller:对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
    • @Configuration:一般用来声明配置类,可以使用 @Component 注解替代,但是使用 @Configuration 注解声明配置类时更易理解。

    自动装配 Bean

    (1)在 Spring 中,自动装配 Bean 的注解有以下几种:

    • @Autowired:自动按照类型进行装配,如果一个接口有多个实现类,可以在需要的属性上加上 @Qualifier 注解指定名称。
    • @Qualifier:在与 @Autowired 连用时,指定按照名称装配。
    • @Resource:默认按照名称进行装配,名称可以通过 name 属性进行指定;如果基于名称注入失败则转为基于类型注入。
    • @Inject:与 @Autowired 功能一样,但是需要额外导入 javax.inject 包,因为它是 Java EE 标准中的注解。

    (2)这些注解可以在某个类中的属性、构造方法或者 set 方法上进行使用,从而使得该属性、构造方法或 set 方法自动装配相应的 Bean。可以根据具体需要选择适合的自动装配注解进行使用。

    声明 Bean 的作用域

    (1)@Scope 注解用于指定 Spring 容器中 Bean 的作用域。它的主要作用是控制 Spring 容器中 Bean 的生命周期,包括创建、初始化、销毁等过程。@Scope 注解有以下几个属性值:

    • singleton (默认值):表示 Spring 容器中只有一个实例,每次请求都返回同一个实例,底层是采用单例模式来实现的。
    • prototype:表示 Spring 容器中每次请求返回一个新的实例。
    • request:表示在一次 HTTP 请求中,每次请求返回一个新的实例。
    • session:表示在一个 HTTP Session 中,每次请求返回一个新的实例。
    • global session:表示在一个全局的 HTTP Session 中,每次请求返回一个新的实例。

    (2)举例说明:

    // @Bean 注解在配置类中通过方法返回值来手动注册为 Bean
    @Bean
    @Scope("prototype")
    public Person personSingleton() {
        return new Person();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上述示例中,使用 @Scope 注解指定 Person 类的作用域为 prototype,表示每次从 Spring 容器中获取该 Bean 时都会返回一个新的实例。如果不指定,默认的作用域为 singleton,表示从 Spring 容器中获取到的都是同一个实例。

    (3)除了上面列举的作用域,Spring 还提供了一些作用域注解和自定义作用域的方式供用户使用,如:@SessionScope、@RequestScope、@ApplicationScope 等。根据实际需要,选择适当的作用域可以有效地控制 Spring 容器中 Bean 的生命周期和内存资源的使用。

    有关注解 @Component 和 @Bean 的区别可参考Spring 常见面试题这篇文章中的 2.4 节。

    前端后传值

    Spring Boot 中前后端传值的注解主要有以下几个:

    • @RequestBody:该注解用于读取前端传来的 Request 请求(例如 POST、PUT、DELETE、GET 等请求)的 body 部分,并且 Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 实体类对象上
    @PostMapping("/user")
    public void addUser(@RequestBody User user) {
        // TODO: 添加用户到数据库
    }
    
    • 1
    • 2
    • 3
    • 4
    • @RequestParam:这个注解用于接收前端传来的请求参数。例如:
    @GetMapping("/user")
    public User getUser(@RequestParam("id") Integer id) {
        // TODO: 根据 id 从数据库中获取用户信息
    }
    
    • 1
    • 2
    • 3
    • 4
    • @PathVariable:这个注解用于接收 URL 中的动态参数。例如:
    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Integer id) {
        // TODO: 根据 id 从数据库中获取用户信息
    }
    
    • 1
    • 2
    • 3
    • 4
    • @ModelAttribute:这个注解用于在表单提交时接收表单中的数据,并将其转换成对应的 Java 实体类对象。例如:
    @PostMapping("/user")
    public void addUser(@ModelAttribute User user) {
        // TODO: 添加用户到数据库
    }
    
    • 1
    • 2
    • 3
    • 4

    注意:一个请求方法只可以有一个 @RequestBody,但是可以有多个 @RequestParam@PathVariable

    处理常见的 HTTP 请求类型

    (1)在介绍与处理常见的 HTTP 请求相关的注解之前,先看看下面 5 种常见的 HTTP 请求类型:

    • GET:用于向指定的 URL 获取数据。例如:
    GET /user?id=1 HTTP/1.1
    Host: example.com
    
    • 1
    • 2
    • POST:用于向指定的 URL 提交数据,数据被包含在请求体中。例如:
    POST /user HTTP/1.1
    Host: example.com
    
    {"id":1, "name":"john", "age":18}
    
    • 1
    • 2
    • 3
    • 4
    • PUT:用于向指定的 URL 提交更新数据,数据被包含在请求体中。例如:
    PUT /user HTTP/1.1
    Host: example.com
    
    {"id":1, "name":"john", "age":19}
    
    • 1
    • 2
    • 3
    • 4
    • DELETE:用于请求服务器删除指定的 URL 资源。例如:
    DELETE /user?id=1 HTTP/1.1
    Host: example.com
    
    • 1
    • 2
    • PATCH:用于向指定的 URL 提交局部修改的数据,数据被包含在请求体中。例如:
    PATCH /user HTTP/1.1
    Host: example.com
    
    {"id":1, "age":20}
    
    • 1
    • 2
    • 3
    • 4

    以上是常见的 5 种 HTTP 请求类型,它们在 RESTful API 中都有广泛应用。它们的不同之处在于请求语义和数据的传递方式,开发者需要根据实际场景选择合适的请求类型。

    (2)Spring Boot 中与处理常见的 HTTP 请求类型有关的注解主要有以下几个:

    • @GetMapping:处理 HTTP 的 GET 请求。例如:
    // @GetMapping("user/{userId}") 等价于 @RequestMapping(value="/user/{userId}", method=RequestMethod.GET)
    @GetMapping("/user/{userId}")
    public RespBean getUserById(@PathVariable("userId") Long userId) {
        // TODO: 根据 userId 从数据库中获取用户信息
        User user = new User();
        user.setId(userId);
        user.setName("Alice");
        user.setAge(20);
        return RespBean.success("获取用户信息成功", user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • @PostMapping:处理 HTTP 的 POST 请求。例如:
    // @PostMapping("user") 等价于 @RequestMapping(value="/user", method=RequestMethod.POST)
    @PostMapping("/user")
    public RespBean addUser(@RequestBody User user) {
        // TODO: 添加用户到数据库,并返回新用户的 id
        Long newUserId = 2L;
        user.setId(newUserId);
        return RespBean.success("添加用户成功", user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • @PutMapping:处理 HTTP 的 PUT 请求。例如:
    // @PutMapping("/user/{userId}") 等价于 @RequestMapping(value="/user/{userId}", method=RequestMethod.PUT)
    @PutMapping("/user/{userId}")
    public RespBean updateUser(@PathVariable("userId") Long userId, @RequestBody User user) {
        // TODO: 根据 userId 更新用户信息,并返回更新后的用户信息
        user.setId(userId);
        user.setAge(30);
        return RespBean.success("更新用户信息成功", user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • @DeleteMapping:处理 HTTP 的 DELETE 请求。例如:
    // @DeleteMapping("/user/{userId}")等价于 @RequestMapping(value="/user/{userId}", method=RequestMethod.DELETE)
    @DeleteMapping("/user/{userId}")
    public RespBean deleteUserById(@PathVariable("userId") Long userId) {
        // TODO: 根据 userId 从数据库中删除用户信息
        return RespBean.success("删除用户信息成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • @PatchMapping:处理 HTTP 的 PATCH 请求,在 RESTful API 中常用于更新部分资源的信息。例如,对于一个 User 对象,我们可以使用 PATCH 请求更新该对象的部分属性,如只更新用户名或者年龄等。具体实现可以根据传入的 JSON 数据中的属性进行判断,只更新其中修改过的属性而不是全部属性。一个示例代码如下:
    @PatchMapping("/users/{userId}")
    public RespBean partialUpdateUser(@PathVariable("userId") Long userId, 
                                      @RequestBody Map<String, Object> updates) {
        // TODO: 根据 userId 更新用户的部分属性
        User user = getUserFromDatabase(userId);
        if (updates.containsKey("name")) {
            user.setName((String) updates.get("name"));
        }
        if (updates.containsKey("age")) {
            user.setAge((Integer) updates.get("age"));
        }
        // ...
        updateUserToDatabase(user);
        return RespBean.success("更新用户信息成功", user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在上面的示例中,通过接收一个 Map 类型的 updates 参数,可以根据不同的属性进行不同的处理,并将更新后的用户对象返回。使用 RespBean 作为统一的结果返回类,可以很方便地将更新结果的状态码、提示语及数据打包成一个 RespBean 返回给调用方。

    (3)以上是 Spring Boot 中常见的 HTTP 请求类型的一些注解,它们可以很方便地处理不同类型的请求并且能够以 RESTful 风格返回数据,在返回结果时使用统一的自定义的 RespBean 类型,使得开发者可以更加方便地统一处理返回结果的格式

    读取配置文件

    与读取配置文件相关的注解如下所示:

    • @Value:获取配置文件中的值;
    • @ConfigurationProperties:将配置文件中的值注入到一个 JavaBean 中;
    • @PropertySource:读取指定位置的 properties 文件;

    上述注解的具体细节可参考Spring Boot 面试题——配置文件这篇文章。

    定时任务

    与实现定时任务相关的注解如下所示:

    • @Scheduled:用于创建定时任务,通过使用该注解,可以在指定的时间间隔内反复执行带有注解的方法。@Scheduled 注解支持 cron 表达式、固定速率和固定延迟等方式来指定任务的执行时间。
    • @Enablescheduling:发现注解 @Scheduled 的任务并在后台执行该任务,一般在启动类上添加该注解;

    上述注解的具体细节可参考 Spring Boot 面试题——定时任务这篇文章。

    全局 Controller 层异常处理

    与全局 Controller 层异常处理相关的注解如下所示:

    • @ControllerAdvice:定义全局异常处理器类,处理异常后返回视图或 HTML 页面,所以处理器方法必须返回 ModelAndView 对象或者 String类型的视图名称;
    • @RestControllerAdvice:定义全局异常处理器类,处理异常后的返回值是纯数据(JSONXML 格式的数据),因此所以处理器方法可以直接返回对象字符串等数据类型;
    • @ExceptionHandler:指定异常处理方法;

    上述注解的具体细节可参考 Spring Boot 面试题——全局异常处理这篇文章。

  • 相关阅读:
    Pohlig-Hellman算法解决DLP问题
    编写Dockerfile
    Docker镜像下载慢/失败?Linux代理使用不便?想无Docker下载镜像?试试我这款开源项目吧
    Java中如何删除文件呢?
    uniapp 高德地图与百度地图精准定位,高德地图定位报错
    【乳腺癌诊断】基于聚类和遗传模糊算法乳腺癌(诊断)分析(Matlab代码实现)
    Java 双冒号 :: 的用法
    python执行unity打包
    ClickHouse—DML操作
    牛客网刷题记录 || 运算符与分支
  • 原文地址:https://blog.csdn.net/weixin_43004044/article/details/131101534