spring 23 @ControllerAdvice 之 @InitBinder

准备 @InitBinder

准备 @InitBinder 在整个 HandlerAdapter 调用过程中所处的位置

sequenceDiagram participant adapter as HandlerAdapter participant bf as WebDataBinderFactory participant mf as ModelFactory participant ihm as ServletInvocableHandlerMethod participant ar as ArgumentResolvers participant rh as ReturnValueHandlers participant container as ModelAndViewContainer rect rgb(200, 150, 255) adapter ->> +bf: 准备 @InitBinder bf -->> -adapter: end adapter ->> +mf: 准备 @ModelAttribute mf ->> +container: 添加Model数据 container -->> -mf: mf -->> -adapter: adapter ->> +ihm: invokeAndHandle ihm ->> +ar: 获取 args ar ->> ar: 有的解析器涉及 RequestBodyAdvice ar ->> container: 有的解析器涉及数据绑定生成Model数据 ar -->> -ihm: args ihm ->> ihm: method.invoke(bean,args) 得到 returnValue ihm ->> +rh: 处理 returnValue rh ->> rh: 有的处理器涉及 ResponseBodyAdvice rh ->> +container: 添加Model数据,处理视图名,是否渲染等 container -->> -rh: rh -->> -ihm: ihm -->> -adapter: adapter ->> +container: 获取 ModelAndView container -->> -adapter:
  • RequestMappingHandlerAdapter 在图中缩写为 HandlerAdapter
  • HandlerMethodArgumentResolverComposite 在图中缩写为 ArgumentResolvers
  • HandlerMethodReturnValueHandlerComposite 在图中缩写为 ReturnValueHandlers

收获💡

  1. RequestMappingHandlerAdapter 初始化时会解析 @ControllerAdvice 中的 @InitBinder 方法
  2. RequestMappingHandlerAdapter 会以类为单位,在该类首次使用时,解析此类的 @InitBinder 方法
  3. 以上两种 @InitBinder 的解析结果都会缓存来避免重复解析
  4. 控制器方法调用时,会综合利用本类的 @InitBinder 方法和 @ControllerAdvice 中的 @InitBinder 方法创建绑定
posted @ 2022-07-03 16:51  xy7112  阅读(38)  评论(0)    收藏  举报