SpringMVC源码之web环境初始化三
基本流程图
image.pngWebServerFactoryCustomizer定制化
TomcatWebSocketServletWebServerCustomizer的customize
其实就是给上下文添加了一个WsContextListener
监听器,这个跟WebSocket
相关,我们暂时不讲,这样就添加了一个TomcatContextCustomizer
,虽然是个lambda
表达式,到时候调用就可以啦。
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addContextCustomizers((context) -> context.addApplicationListener(WsContextListener.class.getName()));
}
ServletWebServerFactoryCustomizer的customize
用PropertyMapper
把ServerProperties
一些通用属性传递给tomcat
工厂。
TomcatServletWebServerFactoryCustomizer的customize
这个先获取ServerProperties
中的tomcat
的Servlet
相关属性,然后设置到相关tomcat
工厂属性里。
TomcatWebServerFactoryCustomizer的customize
用PropertyMapper
把ServerProperties
的tomcat
的属性传递给tomcat
工厂。
LocaleCharsetMappingsCustomizer的customize
设置tomcat
工厂的编码映射。
ErrorPageRegistrarBeanPostProcessor的处理
这个也得处理tomcat
工厂:
getRegistrars获取注册器
从容器里获取ErrorPageRegistrar
类型的bean
,其实就是ErrorPageCustomizer
,是ErrorMvcAutoConfiguration
配置类提供的:
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
DispatcherServletRegistrationBean的依赖
在DispatcherServletAutoConfiguration
中,也有DispatcherServletRegistrationBean
工厂方法,关键的是他的依赖是DispatcherServlet
,所以还会去实例化DispatcherServlet
:
实例化DispatcherServlet
最后就到DispatcherServletAutoConfiguration
的DispatcherServletAutoConfiguration
的dispatcherServlet
方法:
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
,就是我们看到报错的时候会显示的那个页面。
至此ServletWebServerFactory
获取好了,是我们的TomcatServletWebServerFactory
。接下来看怎么创建tomcat