SpringBoot配置类与拦截器笔记

一、配置类(Configuration)

1. 配置类基本概念

配置类是SpringBoot中用于替代XML配置文件的Java类,使用@Configuration注解标识,通过@Bean注解将对象注册到Spring容器中。

2. BeanConfiguration配置类示例

package cn.wolfcode.config;

import cn.wolfcode.domain.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfiguration {

    @Value("${user.name123}")
    private String name;

    @Value("${user.password}")
    private String password;

    @Bean
    public User user1() {
        return new User(name, password);
    }

    @Bean
    public User user2() {
        return new User(name + "2", password);
    }
}

3. 核心注解说明

@Configuration

  • 作用:标识当前类为配置类
  • 说明:相当于Spring XML配置文件中的<beans>标签
  • 位置:类级别

@Bean

  • 作用:将方法的返回值注册为Spring容器中的Bean
  • 说明:相当于XML中的<bean>标签
  • 位置:方法级别
  • 特点
    • 方法名默认作为Bean的名称
    • 方法返回值作为Bean的类型
    • 方法参数自动从容器中注入

@Value

  • 作用:从配置文件中读取属性值并注入
  • 说明:支持SpEL表达式
  • 语法${属性名}
  • 位置:字段或方法参数

4. 配置文件示例

application.yml中配置属性:

user:
  name123: admin
  password: 123456

5. 配置类使用场景

  • 第三方库的Bean配置
  • 复杂对象的初始化
  • 需要特定逻辑的Bean创建
  • 替代XML配置文件

二、Web配置类(WebConfiguration)

1. WebConfiguration配置类示例

package cn.wolfcode.config;

import cn.wolfcode.intercept.TimeIntercept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Autowired
    private TimeIntercept timeIntercept;

    @Bean
    public TimeIntercept timeIntercept() {
        return new TimeIntercept();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeIntercept).addPathPatterns("/**");
    }
}

2. WebMvcConfigurer接口

  • 作用:提供Spring MVC的配置回调接口
  • 常用方法
    • addInterceptors():添加拦截器
    • addViewControllers():添加视图控制器
    • addResourceHandlers():添加静态资源处理器
    • configureMessageConverters():配置消息转换器

3. 拦截器注册

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(timeIntercept)
            .addPathPatterns("/**")  // 拦截所有路径
            .excludePathPatterns("/static/**");  // 排除静态资源
}

常用方法:

  • addPathPatterns():添加需要拦截的路径
  • excludePathPatterns():添加不需要拦截的路径

三、拦截器(Interceptor)

1. 拦截器基本概念

拦截器是Spring MVC提供的一种机制,用于在请求处理的不同阶段进行拦截和处理,类似于Servlet中的Filter。

2. TimeIntercept拦截器示例

package cn.wolfcode.intercept;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;

public class TimeIntercept implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器执行,记录开始时间");
        long t1 = new Date().getTime();
        request.setAttribute("startTime", t1);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        Long t1 = (Long) request.getAttribute("startTime");
        long t2 = new Date().getTime();
        System.out.println(request.getRequestURI() + "耗时:" + (t2 - t1));
    }
}

3. HandlerInterceptor接口方法

preHandle()

  • 执行时机:在Controller方法执行之前
  • 返回值
    • true:继续执行后续拦截器和Controller方法
    • false:中断请求,不执行后续处理
  • 用途
    • 权限验证
    • 参数校验
    • 记录请求开始时间
    • 登录状态检查

postHandle()

  • 执行时机:在Controller方法执行之后,视图渲染之前
  • 参数
    • modelAndView:Controller返回的模型和视图对象
  • 用途
    • 修改模型数据
    • 记录请求处理时间
    • 添加公共数据到模型

4. 拦截器执行顺序

请求 → preHandle1 → preHandle2 → Controller → postHandle2 → postHandle1 → afterCompletion2 → afterCompletion1 → 响应

注意: 多个拦截器的执行顺序是先进后出(栈结构)

四、配置类与拦截器完整流程

1. 创建拦截器类

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 前置处理逻辑
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 后置处理逻辑
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 完成后处理逻辑
    }
}

2. 创建Web配置类

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/static/**");
    }
}

五、常见应用场景

1. 登录验证拦截器

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    String uri = request.getRequestURI();
    if (uri.contains("/login")) {
        return true;
    }
    
    HttpSession session = request.getSession();
    if (session.getAttribute("user") == null) {
        response.sendRedirect("/login");
        return false;
    }
    return true;
}

2. 请求耗时统计

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    request.setAttribute("startTime", System.currentTimeMillis());
    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    Long startTime = (Long) request.getAttribute("startTime");
    long endTime = System.currentTimeMillis();
    System.out.println("请求耗时:" + (endTime - startTime) + "ms");
}
posted on 2026-01-31 09:29  关羽飞  阅读(5)  评论(0)    收藏  举报