主要观点总结
文章总结了Spring Boot框架的一系列内置功能,包括请求数据全链路追踪、请求响应灵活操控、单次执行保障、AOP开发助力、依赖管理魔法、配置简化利器、异步与定时任务、监控与诊断以及表达式的力量等。
关键观点总结
关键观点1: 请求数据全链路追踪
通过CommonsRequestLoggingFilter记录请求的完整信息,支持多维度数据采集,如请求参数、请求体、请求头及客户端IP等。通过灵活日志格式和快速启用配置过滤器实现。
关键观点2: 请求响应灵活操控
通过ContentCachingRequestWrapper和ContentCachingResponseWrapper解决原生HttpServletRequest和HttpServletResponse的输入输出流问题,允许多次读取请求体和缓存响应输出流。
关键观点3: 单次执行保障
OncePerRequestFilter确保过滤器在请求生命周期内仅执行一次,避免在请求转发或包含场景中普通过滤器重复执行。
关键观点4: AOP开发助力
介绍AopContext、AopUtils和ReflectionUtils等实用工具类,简化代理对象操作与反射逻辑。
关键观点5: 依赖管理魔法
通过Starter自动装配体系,开发者无需手动搜索和匹配兼容版本,框架自动处理传递依赖冲突。
关键观点6: 配置简化利器
通过智能自动配置和类型安全的配置绑定,大幅减少样板代码,支持从application.properties/yml中动态注入配置。
关键观点7: 异步与定时任务
通过@Async和@Scheduled注解简化异步任务和定时任务开发,无需手动编写线程池或Quartz配置。
关键观点8: 监控与诊断
Spring Boot Actuator提供生产级工具,帮助开发者监控应用状态、查看性能指标,甚至动态调整配置。
关键观点9: 表达式的力量
介绍SpEL(Spring表达式语言)在配置、注解和代码中的动态计算能力,实现灵活的逻辑控制。
正文
) :
缓存响应输出流,支持在响应提交前修改内容(如添加签名、动态拼接数据)。
实战应用(过滤器实现)
// 请求包装器过滤器
@Component
publicclass RequestLogFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 包装请求,缓存输入流
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
byte[] requestBody = wrappedRequest.getContentAsByteArray();
// 记录请求日志(可在此处添加自定义逻辑)
log.debug("Received request body: {}", new String(requestBody));
// 传递包装后的请求,确保后续组件能重复读取
filterChain.doFilter(wrappedRequest, response);
}
}
// 响应包装器过滤器
@Component
publicclass ResponseSignFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 包装响应,缓存输出流
ContentCachingResponseWrapper wrappedResponse = new ContentCachingResponseWrapper(response);
// 执行后续处理(控制器逻辑)
filterChain.doFilter(request, wrappedResponse);
// 响应后处理:添加签名
byte[] responseBody = wrappedResponse.getContentAsByteArray();
String signature = generateSignature(responseBody);
wrappedResponse.setHeader("X-Response-Signature", signature);
// 必须调用此方法将缓存内容写入原始响应
wrappedResponse.copyBodyToResponse();
}
private String generateSignature(byte[] body) {
// 自定义签名逻辑
return Base64.getEncoder().encodeToString(body);
}
}
三、单次执行保障:OncePerRequestFilter 基类
在请求转发(
forward
)或包含(
include
)场景中,普通过滤器可能重复执行,导致逻辑混乱。
OncePerRequestFilter
确保过滤器在请求生命周期内仅执行一次,是处理状态性逻辑的理想选择。
核心优势
避免重复处理:
通过
shouldNotFilter
方法内部逻辑,自动识别同一请求的多次调度,确保
doFilterInternal
仅执行一次。
简化开发:
只需重写
doFilterInternal
方法,无需手动处理请求标识或缓存执行状态。
适用场景
日志记录:
避免转发时重复打印日志。
安全校验:
如 JWT 解析,确保身份验证仅执行一次。
性能监控:
精确记录单次请求处理耗时,避免统计误差。
四、AOP 开发助力:实用工具类三件套
Spring AOP 的强大离不开三个辅助类,它们简化了代理对象操作与反射逻辑,是切面编程的得力助手。
1. AopContext:代理对象访问器
当同一类中方法调用导致注解(如
@Transactional
)失效时,
AopContext.currentProxy()
可获取当前代理对象,确保切面逻辑正确触发:
public class ServiceImpl {
@Transactional
public void innerMethod() {
// 正常事务逻辑
}
public