跳至主要內容
springboot源码解析:用@RestControllerAdvice和@ExceptionHandler处理全局异常

摘要

本文讨论 Spring Boot 中的 @RestControllerAdvice 注解及其作用。@RestControllerAdvice 注解用于定义全局异常处理器和全局数据绑定设置。它标记的类可以处理全局范围内的异常,并根据定义的处理方法执行自定义逻辑。我们还探讨了 Spring 底层是如何实现和处理 @RestControllerAdvice 的。

Spring Boot 使用基于注解的配置方式,通过扫描和初始化标记了 @RestControllerAdvice 注解的类来创建全局异常处理器。该类中的方法使用 @ExceptionHandler 注解来标记,用于处理特定类型的异常。通过 AOP 和事件机制,Spring 在关键的处理流程中拦截、处理异常和数据绑定,并使用 @RestControllerAdvice 注解提供的机制来实现全局异常处理和数据绑定设置。


程序员诚哥大约 6 分钟面试题springbootjava
讲讲@Configuration 和 @Component 的区别

一句话回答

  • @Configuration 用于定义配置类,其中包含了用 @Bean 注解定义的 bean 创建方法,用于配置 Spring 容器。
  • @Component 用于标记普通的 Spring bean 类,它们可以是服务类、数据访问对象或其他组件,用于自动扫描和注册到 Spring 容器。

详细回答

  1. @Configuration
    • @Configuration 是一个特殊的 Spring 注解,它用于标记一个类,表明这个类是一个配置类。配置类通常包含了一组用于定义 Spring bean 的方法。
    • 配置类中的方法通常使用 @Bean 注解来定义 bean 对象,并且这些方法可以包含复杂的逻辑,以创建和配置 bean。
    • @Configuration 类通常用于 Java 配置方式,它允许你以编程方式配置 Spring 容器。这对于集中管理应用程序的配置非常有用。

程序员诚哥大约 3 分钟面试题springbootjava
interceptor和filter的区别

Interceptor(拦截器)和 Filter(过滤器)都是在Java Web应用中用于处理请求和响应的组件,但它们有一些关键区别:

  1. 位置

    • Filter位于Web容器的底层,它拦截请求和响应在Servlet之前和之后的所有内容,包括静态资源(如HTML、CSS、JavaScript文件)。
    • Interceptor是Spring框架的一部分,通常用于拦截处理器方法(Controller方法)的调用,它在Servlet层之上工作,专门用于Spring MVC应用。
  2. 依赖

    • Filter是Servlet规范的一部分,不依赖于任何特定的框架。你可以在任何Servlet容器中使用它,而不仅仅是在Spring应用中。
    • Interceptor是Spring框架的一部分,因此依赖于Spring。它仅在Spring应用中使用,并且通常与Spring MVC一起工作。
  3. 使用范围

    • Filter通常用于处理与HTTP请求和响应相关的通用任务,如日志记录、字符编码转换、身份验证、跨站点请求伪造(CSRF)防护等。
    • Interceptor主要用于Spring MVC应用中,在请求到达控制器(Controller)之前或之后执行特定的操作,如身份验证、日志记录、性能测量、权限检查等。
  4. 配置方式

    • Filter的配置通常在web.xml文件中进行,或者通过注解方式配置(Servlet 3.0+支持)。
    • Interceptor的配置是在Spring配置文件中进行的,通常通过实现HandlerInterceptor接口来创建自定义拦截器,并在配置文件中声明它们。
  5. 执行顺序

    • Filter的执行顺序在web.xml中定义的顺序,或者在注解中指定的顺序。多个Filter按照配置的顺序依次执行。
    • Interceptor的执行顺序可以通过配置来定义,Spring框架会按照配置的顺序执行多个拦截器。

程序员诚哥大约 2 分钟面试题springbootjava
SpringBoot 如何进行参数校验

在Spring Boot中进行参数校验通常是使用JSR 303规范(也称为Bean Validation)的注解和Spring的Validation API来完成的。以下是一些常见的步骤和示例,用于在Spring Boot应用程序中进行参数校验:

  1. 添加依赖:
    首先,确保在项目的pom.xml文件中添加以下依赖,以引入Spring Boot和Bean Validation相关的库:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
    
  2. 创建DTO类(数据传输对象):
    在你的应用中创建一个DTO类,该类用于接收和验证请求参数。在DTO类的字段上使用Bean Validation注解来指定参数校验规则。例如:

    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Positive;
    
    public class UserDTO {
        @NotBlank(message = "用户名不能为空")
        private String username;
        
        @Positive(message = "年龄必须为正整数")
        private int age;
        
        // Getter和Setter方法
    }
    

程序员诚哥大约 3 分钟面试题springbootjava
SpringBoot中@Autowired @Resource @Qualifier的区别

@Autowired@Resource@Qualifier 是在Spring框架中用于管理依赖注入和连接Bean的常用注解,它们各自有不同的用途:

  • @Autowired 主要用于基于类型的注入。
  • @Resource 用于基于名称的注入,不仅限于Spring。
  • @Qualifier 用于在存在多个相同类型的Bean可供注入时,指定Bean的名称或标识符,通常与 @Autowired@Resource 结合使用来解决歧义问题。

程序员诚哥大约 1 分钟面试题springbootjava
讲讲springboot的@Async

Spring Boot的@Async注解用于表示一个方法是异步的,即该方法可以在一个独立的线程中执行,而不会阻塞当前线程。这对于处理一些耗时的操作非常有用,如发送电子邮件、生成报表、处理文件上传等。使用@Async注解可以提高应用程序的响应性和性能。

下面是使用@Async注解的一般步骤:

  1. 在Spring Boot应用程序的配置类上添加@EnableAsync注解,以启用异步方法的支持。这通常是在应用程序的主配置类上完成的。

程序员诚哥大约 2 分钟面试题springbootjava
如何自学springboot+vue做一个小项目?然后参与开源项目!
观看建议 建议两倍速度观看!!! 最近在和几位小伙伴做基于springboot+vue开源商城和库存管理系统,今天分享一下我们自学前后端开发然后参与开源的一些经验。希望大家都能通过编程来编写美好前程。 不建议买一本书去学,书本的文字描述无法做到直观的表达,还是视频更容易接受一点。B站上有很多视频,从入门到项目实践,全部都有,找播放量和点赞量大的。一般视...

程序员诚哥大约 5 分钟编程笔记码农的自我修养自学springbootvue