从springboot 启动开始 SpringApplication.run
创建ApplicatonContext
调用AnnotationConfigServletWebServerApplicationContext
的refreshContext方法
调用AnnotationConfigServletWebServerApplicationContext的refresh
方法
AnnotationConfigServletWebServerApplicationContext
继承了ServletWebServerApplicationContext
ServletWebServerApplicationContext 继承了AbstractApplicationContext
调用AbstractApplicationContext 的refresh方法
ServletWebServerApplicationContext 他对父类AbstractApplicationContext的onRefresh
进行了重写
调用ServletWebServerApplicationContext的createWebServer方法
调用ServletWebServerApplicationContext的getWebServerFactory的方法来获取所有实现ServletWebServerFactory的bean,如果多个取第一个
获取了UndertowServletWebServerFactory对象这个对象在ServletWebServerFactoryConfiguration中初始化
创建manager,这个manager 很重要,用于创建undertow的httphandler
初始化UndertowServletWebServer 实现WebServer,这个接口是web容器的核心接口
AnnotationConfigReactiveWebServerApplicationContext
在
Case REACTIVE 进行了初始化
AnnotationConfigReactiveWebServerApplicationContext继承了ReactiveWebServerApplicationContext 继承了GenericReactiveWebApplicationContext 在GenericReactiveWebApplicationContext refresh中调用了finishRefresh,ReactiveWebServerApplicationContext对finishRefresh进行了重写
调用了UndertowServletWebServer的start方法
经过上面的过程发现一个问题,在undertow添加servlet 的时候只是添加了自己的defualtservlet,并没有添加DispatcherServle,那DispatcherServle是在什么时候添加进去的?
springboot中注册Servlet的两种方式:
第一种:
@WebServlet注解 ,但是DispatcherServlet并不是自定义的servlet,而是框架提供的servlet。
第二种
springboot 的ServletRegistrationBean用bean的方式来注册servlet
在DispatcherServletAutoConfiguration中注册了ServletRegistrationBean(dispatcherServlet)
而dispatcherServlet在
进行初始化
比如我们自定义一个servlet
@Bean public ServletRegistrationBean myServlet(){ return new ServletRegistrationBean(new Servlet(){ @Override public void init(ServletConfig config) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { } @Override public String getServletInfo() { return null; } @Override public void destroy() { } },"/test"); }
总结 springboot 自定义web容器过程