1. ResponseBodyAdvice
和 RequestBodyAdvice
可以对 @RequestBody
的参数进行各种处理,本质上都是 AOP
1. ResponseBodyAdvice
ResponseBodyAdvice
可以在注解 @ResponseBody
将返回值处理成相应格式之前操作返回值。用于对 response 数据的一些统一封装或者加密等操作, 再将结果返回给客户端, 可以实现该接口, 并增加注解 @RestControllerAdvice
来拦截处理, 其有 2 个方法
supports
: 判断是否要执行 beforeBodyWrite 方法, true 为执行, false不执行. 通过该方法可以选择哪些类或那些方法的 response 要进行处理, 其他的不进行处理beforeBodyWrite
: 在 RequestBody 写入前进行处理, 比如统一封装
2. RequestBodyAdvice
给请求体参数做增强处理, 可以实现该接口, 并增加注解 @RestControllerAdvice
来拦截处理
supports
: 判断是否要执行下面 3 个方法beforeBodyRead
: 在 RequestBody 读取前进行处理afterBodyRead
: 在 RequestBody 读取后进行处理handleEmptyBody
: 在 RequestBody 为空时处理
2. BeanPostProcessor
、BeanFactoryPostProcessor
、BeanDefinitionRegistryPostProcessor
1. BeanPostProcessor
Bean 后置处理器,Bean 初始化前后,会回调 BeanPostProcessor
中定义的两个方法
1 | public interface BeanPostProcessor { |
2. BeanFactoryPostProcessor
和 BeanDefinitionRegistryPostProcessor
前者实现它可以对 Bean 工厂中 Bean 定义(BeanDefintion
)进行修改,它的执行时机是 BeanFactory 标准初始化之后,所有的 Bean 定义已经被加载,但标准 Bean 的实例还没被创建(不包括 BeanFactoryPostProcessor
类型)。BeanDefinitionRegistryPostProcessor
继承自前者,所有的 Bean 定义即将被加载,但Bean的实例还没被创建时,也就是说,BeanDefinitionRegistryPostProcessor
的 postProcessBeanDefinitionRegistry
方法执行时机先于前者的 postProcessBeanFactory
方法。
3. 执行顺序
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
BeanPostProcessor
3. springboot 生命周期相关
1. 启动时执行
@PostConstruct
: beans 初始化前执行CommandLineRunner
: beans初始化后执行,实现方法run
方法,可以在类上使用@Order(n)
定义多个并按顺序有小到大执行ApplicationRunner
: 类似CommandLineRunner
,只是实现方法run
参数不一样
1 | // CommandLineRunner |
2. 结束前执行
DisposableBean
: 实现destroy
方法@PreDestroy
: 在DisposableBean
之前执行
1 |
|
4. Request
和 Response
处理
HttpServletRequestWrapper
和 HttpServletResponseWrapper
是 Servlet 规范中定义的包装器,用来扩展和增强请求和相应参数
1. HttpServletRequestWrapper
getParameterNames()
: 获取 request 里所有的 name,返回 Enumeration 类型getParameter(String name)
: 获取 name 对应的 value,如果有多个,返回第一个getParameterValues(String name)
: 获取 name 对应的所有 valuegetParameterMap()
: 不可一个修改的 map,可以新建一个进行修改,最后返回时必须调用Collections.unmodifiableMap(Map<? extends K, ? extends V> m)
把 map 改成不可变getInputStream()
: 获取输入流,但只能读取一次,需要读取之后存储下来
1 |
|
2. HttpServletResponseWrapper
getOutputStream()
: 获取输出流
1 |
|