美文网首页
SpringMVC源码之web环境初始化三

SpringMVC源码之web环境初始化三

作者: 程序员札记 | 来源:发表于2023-05-27 06:19 被阅读0次

    基本流程图

    image.png

    WebServerFactoryCustomizer定制化

    TomcatWebSocketServletWebServerCustomizer的customize

    其实就是给上下文添加了一个WsContextListener监听器,这个跟WebSocket相关,我们暂时不讲,这样就添加了一个TomcatContextCustomizer,虽然是个lambda表达式,到时候调用就可以啦。

        @Override
        public void customize(TomcatServletWebServerFactory factory) {
            factory.addContextCustomizers((context) -> context.addApplicationListener(WsContextListener.class.getName()));
        }
    
    

    ServletWebServerFactoryCustomizer的customize

    PropertyMapperServerProperties一些通用属性传递给tomcat工厂。

    image.png

    TomcatServletWebServerFactoryCustomizer的customize

    这个先获取ServerProperties中的tomcatServlet相关属性,然后设置到相关tomcat工厂属性里。

    image.png

    TomcatWebServerFactoryCustomizer的customize

    PropertyMapperServerPropertiestomcat的属性传递给tomcat工厂。

    image.png

    LocaleCharsetMappingsCustomizer的customize

    设置tomcat工厂的编码映射。

    image.png

    ErrorPageRegistrarBeanPostProcessor的处理

    这个也得处理tomcat工厂:

    image.png

    getRegistrars获取注册器

    从容器里获取ErrorPageRegistrar类型的bean,其实就是ErrorPageCustomizer,是ErrorMvcAutoConfiguration配置类提供的:

    image.png
        private Collection<ErrorPageRegistrar> getRegistrars() {
            if (this.registrars == null) {
                // Look up does not include the parent context
                this.registrars = new ArrayList<>(
                        this.beanFactory.getBeansOfType(ErrorPageRegistrar.class, false, false).values());
                this.registrars.sort(AnnotationAwareOrderComparator.INSTANCE);
                this.registrars = Collections.unmodifiableList(this.registrars);
            }
            return this.registrars;
        }
    
    

    依赖加载DispatcherServletPath

    这个工厂方法是有依赖属性DispatcherServletPath,实现类就是DispatcherServletRegistrationBean

    image.png

    DispatcherServletRegistrationBean的依赖

    DispatcherServletAutoConfiguration中,也有DispatcherServletRegistrationBean工厂方法,关键的是他的依赖是DispatcherServlet,所以还会去实例化DispatcherServlet

    image.png

    实例化DispatcherServlet

    最后就到DispatcherServletAutoConfigurationDispatcherServletAutoConfigurationdispatcherServlet方法:

    image.png

    ErrorPageCustomizer的registerErrorPages注册错误页面

    前面为了实例化ErrorPageCustomizer,实例化了DispatcherServlet,这里会创建一个ErrorPage ,放入tomcat工厂中。

            @Override
            public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
                ErrorPage errorPage = new ErrorPage(
                        this.dispatcherServletPath.getRelativePath(this.properties.getError().getPath()));
                errorPageRegistry.addErrorPages(errorPage);
            }
    
    

    其实uri就是/error,就是我们看到报错的时候会显示的那个页面。

    image.png

    至此ServletWebServerFactory获取好了,是我们的TomcatServletWebServerFactory。接下来看怎么创建tomcat

    相关文章

      网友评论

          本文标题:SpringMVC源码之web环境初始化三

          本文链接:https://www.haomeiwen.com/subject/miyledtx.html