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. 执行顺序
BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessorBeanPostProcessor
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 |
|
