【小家Spring】Spring MVC容器启动时,web九大组件初始化详解(Spring MVC的运行机制)(下)

简介: 【小家Spring】Spring MVC容器启动时,web九大组件初始化详解(Spring MVC的运行机制)(下)

initLocaleResolver


  private void initLocaleResolver(ApplicationContext context) {
    try {
      this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
    } catch (NoSuchBeanDefinitionException ex) {
      // We need to use the default.
      this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);
    }
  }

若我们自己配置配置LocaleResolver,会调用getDefaultStrategy去获取默认的处理器:

默认处理器在DispatcherServlet.properties这个文件里,如下:


image.png


initHandlerMappings


原理同下,默认值为:


image.png

开启了@EnableMvc注解后,拿到的HandlerMapping为:

image.png


不开启这个注解:解析配置文件得到默认值:


image.png

initHandlerAdapters


原理同下,默认值为:


initHandlerExceptionResolvers


处理方式同initViewResolvers,因此此处不再解释。默认会配置如下三个Bean(若我们自己都没有配置的话):

image.png



关于详细时候,后面会专门有所概述


initRequestToViewNameTranslator


逻辑同上,默认值为:

image.png

initViewResolvers


视图解析器,稍微复杂点。


private void initViewResolvers(ApplicationContext context) {
  this.viewResolvers = null;
  if (this.detectAllViewResolvers) {
    // 如果detectAllViewResolvers为true,那么就会去容器里找所有的(包含所有祖先上下文)容器里的所有的此接口下的此类的bean,最后都放进去(可以有多个嘛)
    Map<String, ViewResolver> matchingBeans =
        BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
    if (!matchingBeans.isEmpty()) {
      this.viewResolvers = new ArrayList<>(matchingBeans.values());
      // We keep ViewResolvers in sorted order.  保持排序性
      AnnotationAwareOrderComparator.sort(this.viewResolvers);
    }
  } else {
    try {
      ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class);
      // 这一步,使用了singletonList,是为了性能考虑,节约内存
      this.viewResolvers = Collections.singletonList(vr);
    }
  }
  // 若还为null,就采用默认配置的视图解析器InternalResourceViewResolver
  if (this.viewResolvers == null) {
    this.viewResolvers = getDefaultStrategies(context, ViewResolver.class);
  }
}


下面说说,什么时候detectAllViewResolvers会为false呢?

默认值为true,回去容器里找到所有的视图解析器的Bean。我们可以通过init-param配置为false,来关闭这个(不建议)


另外,需要注意的是,我们发现虽然我们没有自己注册Bean进去,但是在matchingBeans这一步时,已经有值了,怎么回事呢?继续扣源码发现:我有这个注解@EnableWebMvc:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}


会发现这个注解导入了DelegatingWebMvcConfiguration,而它是


public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {}


的子类,而WebMvcConfigurationSupport我们就比较熟悉了,它默认配置注册了很多东西到MVC的配置中,所以我们才会发现那个时候就已经matchingBeans有值了。那我们去掉@EnableWebMvc再试试呢?


我们发现,从容器里就拿不出Bean了,只能读取配置文件里的默认值了~

initFlashMapManager


默认值为:

image.png


总结

DispatcherServlet的Spring MVC9大组件的介绍,以及他们的初始化的一个流程就到这了。还是那句话,理解了这些来龙去脉,会更有助于我们的流畅的使用、定制Spring MVC的一些功能~

相关文章
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
683 1
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
578 2
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
273 3
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
1992 2
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
1728 0
|
消息中间件 监控 Kafka
Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面
随着大数据技术的发展,Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面,方便管理和监控 Kafka 集群。本文详细介绍了 Kafka Manager 的部署步骤和基本使用方法,包括配置文件的修改、启动命令、API 示例代码等,帮助你快速上手并有效管理 Kafka 集群。
341 0
|
Java Maven Spring
用Spring导致的无法运行Java文件的问题的解决方案
本文提供了解决在IntelliJ IDEA社区版中使用Spring Initializr插件创建Spring项目后,Java文件无法运行的问题的方法,主要是通过加载Maven项目来解决。
367 0
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
944 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
542 0
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
390 0