2023-09-14
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105518388

基本流程图,方法查看

202309142259572931.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工厂。

202309142259585432.png

TomcatServletWebServerFactoryCustomizer的customize

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

202309142259594943.png

TomcatWebServerFactoryCustomizer的customize

PropertyMapperServerPropertiestomcat的属性传递给tomcat工厂。

202309142300005414.png

LocaleCharsetMappingsCustomizer的customize

设置tomcat工厂的编码映射。

202309142300021745.png

ErrorPageRegistrarBeanPostProcessor的处理

这个也得处理tomcat工厂:

202309142300032006.png

getRegistrars获取注册器

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

202309142300040617.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

202309142300047938.png

DispatcherServletRegistrationBean的依赖

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

202309142300056319.png

实例化DispatcherServlet

最后就到DispatcherServletAutoConfigurationDispatcherServletAutoConfigurationdispatcherServlet方法:

2023091423000635510.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,就是我们看到报错的时候会显示的那个页面。

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

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

阅读全文