
启动tomcat后,首先执行ServletContainersInitConfig类,这个类也是SpringMVC创建的第四步,初始化Servlet容器,在这个类中继承AbstractDisparcherServletInitializer这个抽象类,然后创建容器,然后new了一个容器对象,加载SpringMVCconfig.class配置类,这个类中有@componentScan注解,

他会扫描控制器中带有@Controller的注解的方法

第二个方法的意思就是把前端发送的所有请求全部拦截下来交给SpringMVC处理
第三个方法是加载spring的,也就是除了表现层,比如service,dao都是归他管理,项目中要这样写:

也就是扫描SpringConfig这个类
再看看ServletContainersInitConfig这个类都干了什么
注意:最新的配置方法:ServletContainerInitConfig继承AbstractAnnotationConfigDIspacherServletInitializer这个类,然后依然实现三个方法,只不过这三个方法相比之前的比较简单,直接在第一个方法里也就是getRootConfigClasses这里return这里填写SpringConfig.class,在getServletConfig这里填Servlet相关的SpringMvcConfig如图所示,然后再最后一个方法getServletMapping这里填写你要get的请求,我们是把所有Servlet的请求全部交给SpringMVC处理,所以这里加直接填return new String[]{“/”};

也就是简化开发:

补充:你提供的代码是一个Spring MVC应用的初始化配置类,它继承自AbstractDispatcherServletInitializer。这个类负责创建和配置两个WebApplicationContext实例:一个用于Spring MVC的Servlet(DispatcherServlet)上下文,另一个用于应用的根上下文。这种分离允许你为Web层和非Web层分别配置不同的Bean。
在你提供的代码中,ServletContainersInitConfig类通过继承AbstractDispatcherServletInitializer来配置Spring MVC应用。这个类创建了三个WebApplicationContext对象,每个对象都扮演着不同的角色:
- 这个上下文是为
DispatcherServlet创建的,它负责处理所有与Web相关的请求。 - 当Web请求到达时,
DispatcherServlet会使用这个上下文来查找和执行相应的控制器(Controllers)。 - 这个上下文通常会注册Spring MVC的配置类(如
SpringMVCConfig.class),其中包含视图解析器、控制器映射、静态资源处理等配置。 - 这个上下文是应用的根上下文,它负责管理非Web层的Bean,比如服务层(Services)、数据访问层(Repositories)等。
- 根上下文通常包含业务逻辑和数据访问逻辑的配置。
- 它通过注册
SpringConfig.class来加载这些非Web相关的配置。 - 这个方法定义了
DispatcherServlet应该处理的请求路径。在这个例子中,"/"表示DispatcherServlet将处理所有进入应用的请求。 - 这意味着所有的HTTP请求都会首先被
DispatcherServlet捕获,然后根据配置的控制器逻辑进行处理。
在你提供的代码中,ServletContainersInitConfig类通过继承AbstractDispatcherServletInitializer来配置Spring MVC应用。这个类创建了三个WebApplicationContext对象,每个对象都扮演着不同的角色:
- 这个上下文是为
DispatcherServlet创建的,它负责处理所有与Web相关的请求。 - 当Web请求到达时,
DispatcherServlet会使用这个上下文来查找和执行相应的控制器(Controllers)。 - 这个上下文通常会注册Spring MVC的配置类(如
SpringMVCConfig.class),其中包含视图解析器、控制器映射、静态资源处理等配置。 - 这个上下文是应用的根上下文,它负责管理非Web层的Bean,比如服务层(Services)、数据访问层(Repositories)等。
- 根上下文通常包含业务逻辑和数据访问逻辑的配置。
- 它通过注册
SpringConfig.class来加载这些非Web相关的配置。 - 这个方法定义了
DispatcherServlet应该处理的请求路径。在这个例子中,"/"表示DispatcherServlet将处理所有进入应用的请求。 - 这意味着所有的HTTP请求都会首先被
DispatcherServlet捕获,然后根据配置的控制器逻辑进行处理。
工作流程:
- 当Web应用启动时,
ServletContainersInitConfig类会被调用,创建两个AnnotationConfigWebApplicationContext实例,分别对应Servlet上下文和根上下文。 - 每个上下文实例会注册相应的配置类(
SpringMVCConfig.class和SpringConfig.class),这些配置类定义了应用中需要的Bean。 - 当Web请求到达服务器时,Servlet容器(如Tomcat)会根据
getServletMappings方法的配置,将请求转发给DispatcherServlet。 DispatcherServlet使用其关联的Servlet应用上下文来处理请求,查找合适的控制器来处理请求,并返回响应。- 在Spring框架中,根应用上下文和Servlet应用上下文可以共享某些Bean,这通过父上下文和子上下文的关系实现。通常,根上下文作为父上下文,而Servlet上下文作为子上下文。
通过这种方式,Spring MVC应用能够有效地分离Web层和非Web层的配置,同时保持它们之间的协作和数据共享。这种结构提高了应用的模块化和可维护性。