Spring Boot 面试题——常用注解

目录

  • [Spring Bean](#Spring Bean)
    • [将一个类声明为 Bean](#将一个类声明为 Bean)
    • [自动装配 Bean](#自动装配 Bean)
    • [声明 Bean 的作用域](#声明 Bean 的作用域)
  • 前端后传值
  • [处理常见的 HTTP 请求类型](#处理常见的 HTTP 请求类型)
  • 读取配置文件
  • 定时任务
  • [全局 Controller 层异常处理](#全局 Controller 层异常处理)

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)举例说明:

java 复制代码
// @Bean 注解在配置类中通过方法返回值来手动注册为 Bean
@Bean
@Scope("prototype")
public Person personSingleton() {
    return new Person();
}

上述示例中,使用 @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 实体类对象上
java 复制代码
@PostMapping("/user")
public void addUser(@RequestBody User user) {
    // TODO: 添加用户到数据库
}
  • @RequestParam:这个注解用于接收前端传来的请求参数。例如:
java 复制代码
@GetMapping("/user")
public User getUser(@RequestParam("id") Integer id) {
    // TODO: 根据 id 从数据库中获取用户信息
}
  • @PathVariable:这个注解用于接收 URL 中的动态参数。例如:
java 复制代码
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Integer id) {
    // TODO: 根据 id 从数据库中获取用户信息
}
  • @ModelAttribute:这个注解用于在表单提交时接收表单中的数据,并将其转换成对应的 Java 实体类对象。例如:
java 复制代码
@PostMapping("/user")
public void addUser(@ModelAttribute User user) {
    // TODO: 添加用户到数据库
}

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

处理常见的 HTTP 请求类型

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

  • GET:用于向指定的 URL 获取数据。例如:
json 复制代码
GET /user?id=1 HTTP/1.1
Host: example.com
  • POST:用于向指定的 URL 提交数据,数据被包含在请求体中。例如:
json 复制代码
POST /user HTTP/1.1
Host: example.com

{"id":1, "name":"john", "age":18}
  • PUT:用于向指定的 URL 提交更新数据,数据被包含在请求体中。例如:
json 复制代码
PUT /user HTTP/1.1
Host: example.com

{"id":1, "name":"john", "age":19}
  • DELETE:用于请求服务器删除指定的 URL 资源。例如:
json 复制代码
DELETE /user?id=1 HTTP/1.1
Host: example.com
  • PATCH:用于向指定的 URL 提交局部修改的数据,数据被包含在请求体中。例如:
json 复制代码
PATCH /user HTTP/1.1
Host: example.com

{"id":1, "age":20}

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

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

  • @GetMapping:处理 HTTP 的 GET 请求。例如:
java 复制代码
// @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);
}
  • @PostMapping:处理 HTTP 的 POST 请求。例如:
java 复制代码
// @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);
}
  • @PutMapping:处理 HTTP 的 PUT 请求。例如:
java 复制代码
// @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);
}
  • @DeleteMapping:处理 HTTP 的 DELETE 请求。例如:
java 复制代码
// @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("删除用户信息成功");
}
  • @PatchMapping:处理 HTTP 的 PATCH 请求,在 RESTful API 中常用于更新部分资源的信息。例如,对于一个 User 对象,我们可以使用 PATCH 请求更新该对象的部分属性,如只更新用户名或者年龄等。具体实现可以根据传入的 JSON 数据中的属性进行判断,只更新其中修改过的属性而不是全部属性。一个示例代码如下:
java 复制代码
@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);
}

在上面的示例中,通过接收一个 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 面试题------全局异常处理这篇文章。

相关推荐
KK溜了溜了2 小时前
JAVA-springboot log日志
java·spring boot·logback
我命由我123453 小时前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
面朝大海,春不暖,花不开3 小时前
Spring Boot消息系统开发指南
java·spring boot·后端
hshpy3 小时前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
jay神3 小时前
基于Springboot的宠物领养系统
java·spring boot·后端·宠物·软件设计与开发
不知几秋4 小时前
Spring Boot
java·前端·spring boot
howard20055 小时前
5.4.2 Spring Boot整合Redis
spring boot·整合redis
TracyCoder1235 小时前
接口限频算法:漏桶算法、令牌桶算法、滑动窗口算法
spring boot·spring·限流
饮长安千年月5 小时前
JavaSec-SpringBoot框架
java·spring boot·后端·计算机网络·安全·web安全·网络安全
考虑考虑6 小时前
Jpa中的@ManyToMany实现增删
spring boot·后端·spring