springmvc-源码调试-3.3-initHandlerAdapters

it2023-03-02  78

文章目录

initHandlerAdaptersHttpRequestHandlerAdapterSimpleControllerHandlerAdapterRequestMappingHandlerAdapterafterPropertiesSetinitControllerAdviceCache getDefaultArgumentResolversgetDefaultInitBinderArgumentResolversgetDefaultReturnValueHandlers HandlerFunctionAdapter

initHandlerAdapters

初始化 HandlerAdapters 处理器适配器 ,这里上个文章分析过就不分析了…

private void initHandlerAdapters(ApplicationContext context) { this.handlerAdapters = null; // 该值默认为 true 但是可以设置为 false // 如果设置为 false 那 Spring MVC就只会查找名为“handlerMapping”的bean,并作为当前系统的唯一的HandlerMapping // 如果是 ture 则查询所有的.. if (this.detectAllHandlerAdapters) { //在ApplicationContext中查找所有handler映射,包括父类上下文。 Map<String, HandlerAdapter> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false); //如果不为空 if (!matchingBeans.isEmpty()) { // 转换成集合 this.handlerAdapters = new ArrayList<>(matchingBeans.values()); // 排序 AnnotationAwareOrderComparator.sort(this.handlerAdapters); } } else { try { // 从容器中获取 HandlerAdapter ,如果获取不到 下面则会添加默认的.. HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class); this.handlerAdapters = Collections.singletonList(ha); } catch (NoSuchBeanDefinitionException ex) { //稍后就会创建一个默认的~~~ } } //通过注册,确保至少有一个 HandlerAdapter //如果找不到其他映射,则为默认的 HandlerAdapter。 if (this.handlerAdapters == null) { this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class); if (logger.isTraceEnabled()) { logger.trace("No HandlerAdapters declared for servlet '" + getServletName() + "': using default strategies from DispatcherServlet.properties"); } } }

简答的说 就是根据 策略会初始化

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter, org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter, org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter, org.springframework.web.servlet.function.support.HandlerFunctionAdapter

HttpRequestHandlerAdapter

这个类倒是没那么复杂… 初始化也没做什么事情… 不深究…

SimpleControllerHandlerAdapter

这个类倒是没那么复杂… 初始化也没做什么事情… 不深究…

RequestMappingHandlerAdapter

这里需要深究. InitializingBean和ApplicationContextAware上文介绍过,这里时机被回调.

ApplicationContextAware这里并不详细说明… 并没有做什么事情

主要深究InitializingBean

afterPropertiesSet

@Override public void afterPropertiesSet() { // initControllerAdviceCache(); // 如果解析器为空 if (this.argumentResolvers == null) { // 获取默认的解析器 List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers(); this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); } // 处理 @initBinder 参数解析器 if (this.initBinderArgumentResolvers == null) { //获取默认的解析器 List<HandlerMethodArgumentResolver> resolvers = getDefaultInitBinderArgumentResolvers(); this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); } // 处理返回参数处理器 if (this.returnValueHandlers == null) { List<HandlerMethodReturnValueHandler> handlers = getDefaultReturnValueHandlers(); this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers); } }

initControllerAdviceCache

初始化 ControllerAdvice

private void initControllerAdviceCache() { if (getApplicationContext() == null) { return; } //获取 所有的 @ControllerAdvice 注解 并且将其包装成 ControllerAdviceBean // 简单来说 @Controller 增强器.. 比如定义 统一反参之类的.. List<ControllerAdviceBean> adviceBeans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext()); List<Object> requestResponseBodyAdviceBeans = new ArrayList<>(); // 循环所有的 ControllerAdviceBean for (ControllerAdviceBean adviceBean : adviceBeans) { // 获取 Class Class<?> beanType = adviceBean.getBeanType(); if (beanType == null) { throw new IllegalStateException("Unresolvable type for ControllerAdviceBean: " + adviceBean); } // 获取 所有 不存在 @RequestMapping 但是存在 @ModelAttribute 注解的方法.. Set<Method> attrMethods = MethodIntrospector.selectMethods(beanType, MODEL_ATTRIBUTE_METHODS); if (!attrMethods.isEmpty()) { this.modelAttributeAdviceCache.put(adviceBean, attrMethods); } // 获取 所有 存在 @InitBinder 的方法 Set<Method> binderMethods = MethodIntrospector.selectMethods(beanType, INIT_BINDER_METHODS); if (!binderMethods.isEmpty()) { this.initBinderAdviceCache.put(adviceBean, binderMethods); } // 判断是不是 RequestBodyAdvice 或者 ResponseBodyAdvice 子类 if (RequestBodyAdvice.class.isAssignableFrom(beanType) || ResponseBodyAdvice.class.isAssignableFrom(beanType)) { requestResponseBodyAdviceBeans.add(adviceBean); } } if (!requestResponseBodyAdviceBeans.isEmpty()) { this.requestResponseBodyAdvice.addAll(0, requestResponseBodyAdviceBeans); } if (logger.isDebugEnabled()) { int modelSize = this.modelAttributeAdviceCache.size(); int binderSize = this.initBinderAdviceCache.size(); int reqCount = getBodyAdviceCount(RequestBodyAdvice.class); int resCount = getBodyAdviceCount(ResponseBodyAdvice.class); if (modelSize == 0 && binderSize == 0 && reqCount == 0 && resCount == 0) { logger.debug("ControllerAdvice beans: none"); } else { logger.debug("ControllerAdvice beans: " + modelSize + " @ModelAttribute, " + binderSize + " @InitBinder, " + reqCount + " RequestBodyAdvice, " + resCount + " ResponseBodyAdvice"); } } }

getDefaultArgumentResolvers

private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() { List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>(); //基于注释的参数解析 resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false)); resolvers.add(new RequestParamMapMethodArgumentResolver()); resolvers.add(new PathVariableMethodArgumentResolver()); resolvers.add(new PathVariableMapMethodArgumentResolver()); resolvers.add(new MatrixVariableMethodArgumentResolver()); resolvers.add(new MatrixVariableMapMethodArgumentResolver()); resolvers.add(new ServletModelAttributeMethodProcessor(false)); resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice)); resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory())); resolvers.add(new RequestHeaderMapMethodArgumentResolver()); resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory())); resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory())); resolvers.add(new SessionAttributeMethodArgumentResolver()); resolvers.add(new RequestAttributeMethodArgumentResolver()); // 基于类型的参数解析 resolvers.add(new ServletRequestMethodArgumentResolver()); resolvers.add(new ServletResponseMethodArgumentResolver()); resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); resolvers.add(new RedirectAttributesMethodArgumentResolver()); resolvers.add(new ModelMethodProcessor()); resolvers.add(new MapMethodProcessor()); resolvers.add(new ErrorsMethodArgumentResolver()); resolvers.add(new SessionStatusMethodArgumentResolver()); resolvers.add(new UriComponentsBuilderMethodArgumentResolver()); // 自定义参数 if (getCustomArgumentResolvers() != null) { resolvers.addAll(getCustomArgumentResolvers()); } // Catch-all resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true)); resolvers.add(new ServletModelAttributeMethodProcessor(true)); return resolvers; }

getDefaultInitBinderArgumentResolvers

//跟上面差不多

getDefaultReturnValueHandlers

//跟上面差不多

HandlerFunctionAdapter

初始化也没做啥东西…

最新回复(0)