查看DispatchServlet的继承关系如下:
上面也说了,所有的servlet都是Servlet接口的实现类,所以都有init方法
当我们的servlet注册进servlet容器后,并不会马上执行init方法初始化
tomcat源码:
而是tomcat会在首次调用此servlet处理请求时,才会调用init方法
依次向下调用,initServletBean
依次向下调用,initWebApplicationContext 初始化Web应用上下文,中有onRefresh方法
执行DispatchServlet类的onRefresh方法
最终进行了各种组件的初始化,如文件上传解析器、处理器映射器、处理器解析器、视图解析器等。
这些组件都是从ApplicaitonContext中拿的,也就是从IOC容器中取的。
那这些组件何时被放入IOC容器的?
是在springboot的WebMvcAutoConfiguration类中有配置类并且有@bean注解,所以在启动时,spring就会创建bean到ioc容器中了。
如果要扩展则只需要实现对应的接口,注册到容器中即可。如实现MultipartResolver接口,可以自定义文件上传解析器。
直接注册到容器就可以生效是因为springboot实现了它的自动配置。由@ConditionalOnMissingBean注解可以得知,当已经存在了MultipartResolver接口的实现类的时候,就不会初始化它的了。