ResponseErrorHandler
基本概念
ResponseErrorHandler是Spring RestTemplate中用于处理HTTP响应错误的接口,允许自定义错误处理逻辑。
源码
执行流程
RestTemplate处理响应的步骤:
1、发送HTTP请求
2、接收响应
3、调用hasError()判断是否有错误
4、如果有错误,调用handleError()处理错误
5、如果无错误,正常返回响应数据
默认实现
Spring提供的默认实现
DefaultResponseErrorHandler
默认情况下,4xx和5xx状态码被认为是错误,会抛出相应的异常。
自定义错误处理
1、基础自定义示例
2、继承默认实现
配置使用
1、设置到RestTemplate
2、在使用时临时设置
注意事项
1、响应流只能读取一次
response.getBody()返回的流只能读取一次,如果需要多次使用,要先缓存内容。
2、异常类型选择
根据业务需要选择合适的异常类型,便于上层代码统一处理。
3、日志记录
在处理错误时应该记录适当的日志,便于问题排查
与其他组件的集成
ResponseErrorHandler经常与RestTemplate的其他组件配合使用:
1、
ClientHttpRequestInterceptor:请求拦截
2、MessageConverter:消息转换
3、ClientHttpRequestFactory:请求工厂
这个接口是RestTemplate错误处理的核心,通过自定义实现可以实现灵活的错误处理策略,提高API调用的健壮性和用户体验。
MultiValueMap
基本概念
MultiValueMap 是 Spring 框架提供的一个特殊 Map 接口,用于处理一个键对应多个值的场景。它是 Spring 框架中处理 HTTP 请求参数、HTTP 头等多值数据结构的核心接口。
源码
与普通Map 的区别
主要实现类
1、LinkedMultiValueMap - 基于 LinkedHashMap 的实现,保持插入顺序
2、
LinkedCaseInsensitiveMultiValueMap - 键不区分大小写的版本
3、CopyOnWriteMultiValueMap - 线程安全的实现
方法
void add(K key, @Nullable V value)
void addAll(K key, List<? extends V> values);
示例代码
结果:
ClientHttpRequestInterceptor
基本概念
Spring Web的
ClientHttpRequestInterceptor接口用于拦截HTTP客户端请求,可以在请求发送前和响应返回后进行统一处理。
源码
方法
ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
基本实现
简单拦截器
配置使用
1、RestTemplate配置
2、直接使用
优点
1、统一处理横切关注点(认证、日志、监控等)
2、代码复用,避免重复
3、链式处理,灵活组合
4、对业务代码无侵入
使用场景
1、API认证和授权
2、请求/响应日志记录
3、性能监控和指标收集
4、请求重试和容错
5、请求签名和加密
6、统一错误处理
总结
简单理解:
ClientHttpRequestInterceptor就像HTTP请求的"过滤器",让你可以在请求发出前和响应返回后进行统一处理。
RequestCallback
基本概念
Spring的RequestCallback接口是RestTemplate中用于自定义HTTP请求的回调接口。
源码
作用
RequestCallback允许你在HTTP请求发送前对请求进行定制化处理,比如设置请求头、请求体、认证信息等。
使用场景
1、设置请求头
2、写入请求体
3、文件上传
在RestTemplate中使用
总结
RequestCallback的核心价值在于提供了对HTTP请求的完全控制权,让你能够精确定制每个请求的细节。
WebApplicationContext
基本概念
WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用,它与普通的 ApplicationContext 在解析主题和决定程序所需的一些额外功能。与哪个 servlet 关联的能力方面有所不同。
源码
方法
ServletContext getServletContext();
只有这一个方法。
特点
WebApplicationContext在普通ApplicationContext基础上增加了Web相关功能,主要是与ServletContext的集成。
主要功能
1、访问ServletContext
2、Web作用域支持
支持Web特有的Bean作用域
request - 每个HTTP请求一个实例
session - 每个HTTP会话一个实例
application - 整个Web应用一个实例
3、层次化结构
典型的Web应用有两层ApplicationContext
应用场景
1、在Controller中获取
2、通过ServletContext获取
3、配置示例
核心价值
WebApplicationContext将Spring容器与Web环境无缝集成,让你可以:
1、在Web组件中轻松使用Spring管理的Bean
2、利用Web特有的作用域
3、访问ServletContext等Web资源
4、实现Web应用的依赖注入
它是Spring Web应用的核心基础设施。
InitializingBean
基本概念
InitializingBean接口为bean提供了初始化的方法,它只包括afterPropertiesSet方法,凡是实现该接口的类,在初始化bean的时候会执行该方法。在Spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。
源码
测试程序
配置文件:
Main主程序:
运行主程序,结果:
这说明在Spring初始化Bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。
问题
实现InitializingBean接口与在配置文件中指定init-method有什么不同?
修改配置文件,加上init-method配置,修改如下:
运行结果如下:
由结果可看出,在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。
总结
(1)Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用。
(2)实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对Spring的依赖。
(3)如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。