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返回的模型和视图对象
- 用途:
- 修改模型数据
- 记录请求处理时间
- 添加公共数据到模型
afterCompletion()
- 执行时机:在视图渲染完成之后
- 用途:
- 资源清理
- 记录日志
- 异常处理
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");
}
3. 跨域处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");
return true;
}
六、拦截器与Filter的区别
| 特性 | 拦截器 | Filter |
|---|---|---|
| 所属框架 | Spring MVC | Servlet |
| 作用范围 | 只拦截Controller请求 | 拦截所有请求 |
| 访问Spring容器 | 可以访问 | 不能直接访问 |
| 执行时机 | DispatcherServlet之后 | DispatcherServlet之前 |
| 配置方式 | Java配置类 | @WebFilter或web.xml |
| 灵活性 | 更灵活 | 相对简单 |
七、注意事项
- 拦截器必须注册:创建拦截器后,必须在Web配置类中注册才能生效
- 返回值控制:preHandle返回false会中断请求链
- 路径匹配:
/**匹配所有路径,包括子路径 - 排除路径:静态资源、登录页面等通常需要排除
- 异常处理:在afterCompletion中处理异常
- 性能考虑:拦截器逻辑尽量简洁,避免影响性能
八、最佳实践
- 职责单一:每个拦截器只负责一个功能
- 合理使用:能用Filter解决的简单问题优先使用Filter
- 日志记录:在拦截器中添加适当的日志
- 异常处理:妥善处理拦截器中的异常
- 性能监控:使用拦截器监控接口性能
- 权限控制:使用拦截器实现统一的权限验证
浙公网安备 33010602011771号