【小家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的一些功能~

相关文章
|
9月前
|
人工智能 JSON 安全
Spring Boot实现无感刷新Token机制
本文深入解析在Spring Boot项目中实现JWT无感刷新Token的机制,涵盖双Token策略、Refresh Token安全性及具体示例代码,帮助开发者提升用户体验与系统安全性。
994 4
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
467 2
|
8月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
794 0
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
549 32
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
759 11
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
2300 15
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
629 8
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
532 4
|
XML 存储 前端开发
手动开发-实现SpringMVC底层机制--小试牛刀
手动开发-实现SpringMVC底层机制--小试牛刀
124 0
|
Java 开发工具 Spring
Spring的Factories机制介绍
Spring的Factories机制介绍
400 1