初始化 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这个类倒是没那么复杂… 初始化也没做什么事情… 不深究…
这个类倒是没那么复杂… 初始化也没做什么事情… 不深究…
这里需要深究. InitializingBean和ApplicationContextAware上文介绍过,这里时机被回调.
ApplicationContextAware这里并不详细说明… 并没有做什么事情
主要深究InitializingBean
初始化 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"); } } }//跟上面差不多
//跟上面差不多
初始化也没做啥东西…