初始化DispatcherServlet的九大组件初始化原理

本文详细描述了在SpringMVC的Servlet中如何在init方法中初始化九大组件,包括MultipartResolver、LocaleResolver、ThemeResolver等,以及如何处理自动检测和配置HandlerMappings和HandlerAdapter的过程。
// 在父类Servlet中的init方法中就执行到了onRefresh方法,开始初始化SpringMVC的九大组件
protected void onRefresh(ApplicationContext context) {
    this.initStrategies(context);{
        this.initMultipartResolver(context);{
            this.multipartResolver = (MultipartResolver)context.getBean("multipartResolver", MultipartResolver.class);
            if(e){
                this.multipartResolver = null;
            }
        }
        this.initLocaleResolver(context);{
            this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
             // 如果出现异常,获取默认的到DispatcherServlet.properties找
            if(e){
                this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);
            }
        }
        this.initThemeResolver(context);{
            this.themeResolver = context.getBean(THEME_RESOLVER_BEAN_NAME, ThemeResolver.class);
             // 如果出现异常,获取默认的到DispatcherServlet.properties找
            if(e){
                this.themeResolver = getDefaultStrategy(context, ThemeResolver.class);
            }
        }
        this.initHandlerMappings(context);{
            this.handlerMappings = null;
            // detectAllHandlerMappings默认为true,会先找已经注册过的HandlerMapping
            // <init-param> 可以通过这个配置修改,让它不要去自动HandlerMappings
            //       <param-name>detectAllHandlerMappings</param-name>
            //       <param-value>false</param-value>
            // </init-param>
            // 而是是用自定义的HandlerMapping,如果自定义了HandlerMapping的话
            if (this.detectAllHandlerMappings) {
                // 判断是否存在HandlerMapping,因为某些逻辑会注册一些HandlerMapping,例如加了下面两个标签,在web.xml解析中有讲到
                // <mvc:default-servlet-handler/>
                // <mvc:annotation-driven/>
                Map<String, HandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
                // 排序,保存
                if (!matchingBeans.isEmpty()) {
                    this.handlerMappings = new ArrayList<>(matchingBeans.values());
                    AnnotationAwareOrderComparator.sort(this.handlerMappings);
                }
            }
            else {
                // 如果将detectAllHandlerMappings设置为了false,表示禁用自动检测和注册HandlerMapping
                // 尝试去Spring容器中去拿单个配置name为handlerMapping的Bean
                // @Bean("handlerMapping")
                // public HandlerMapping handlerMapping() {
                //    return new RequestMappingHandlerMapping();
                // }
                // 	public static final String HANDLER_MAPPING_BEAN_NAME = "handlerMapping";
                HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
                this.handlerMappings = Collections.singletonList(hm);
            }
            // 如果都没有配置,那么加载SpringMVC提供的默认的HandlerMapping
            if (this.handlerMappings == null) {
                // 默认的handlerMapping有三个
                this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);{
                    // 加载spring-webmvc包下的DispatcherServlet.properties配置文件,这里提供了默认的
                    // 除了MultipartResolver的其他八大组件的默认对象
                    // 	private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";
                    ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
                    Properties defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
                }
            }
            for (HandlerMapping mapping : this.handlerMappings) {
                   // 默认都为false,除非设置了mapping.setPatternParser();
                if (mapping.usesPathPatterns()) {
                    // 表示可以解析请求路径了
                    this.parseRequestPath = true;
                    break;
                }
            }
        }
        this.initHandlerAdapters(context);{
            // 和handlerMapping完全一样的逻辑
            // 自定义BeanName为	public static final String HANDLER_ADAPTER_BEAN_NAME = "handlerAdapter";
        }

        // 以下四个,和initLocaleResolver完全一样,先成spring中获取,如果没有,就使用默认的
        this.initHandlerExceptionResolvers(context);
        this.initRequestToViewNameTranslator(context);
        this.initViewResolvers(context);
        this.initFlashMapManager(context);
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值