首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring MVC 整合 Servlet 3.0

Spring MVC 整合 Servlet 3.0

作者头像
wsuo
发布2020-07-30 18:43:02
发布2020-07-30 18:43:02
7010
举报
文章被收录于专栏:技术进阶之路技术进阶之路

根据 Servlet 3.0 的新特性,web 容器启动的时候会扫描每个 jar 包下的 /META-INF/services/javax.servlet.ServletContainerInitializer 文件。

使用 Spring MVC 的 web 包,可以看到有这个文件:

文件内容如下:

代码语言:javascript
复制
org.springframework.web.SpringServletContainerInitializer

该类的头部信息如下:

代码语言:javascript
复制
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

Spring 的应用一启动就会加载感兴趣的 WebApplicationInitializer 接口下的组件,并且为这些组件创建对象。

  • AbstractContextLoaderInitializer:创建根容器 rootAppContext;
  • AbstractDispatcherServletInitializer
    1. 创建一个 web 的 IOC 容器 servletAppContext
    2. 创建一个 dispatcherServlet
    3. 将创建的 dispatcherServlet 添加到容器中;
  • AbstractAnnotationConfigDispatcherServletInitializer:注解方式配置 dispatcherServlet 的初始化器:
    1. 首先创建根容器;
    2. 创建 web IOC 容器;

所以我们要想以注解的方式启动 SpringMVC 只需要写一个类继承 AbstractAnnotationConfigDispatcherServletInitializer ,然后实现抽象方法指定 DispatcherServlet 的配置信息。

代码语言:javascript
复制
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * 获取根容器的配置类: 相当于 Spring 的配置文件
     *
     * @return 根容器的配置类
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
    /**
     * 获取 Web 容器的配置类: 相当于 Spring MVC 的配置文件
     *
     * @return Web 容器的配置类
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{ServletConfig.class};
    }
    /**
     * 获取 Servlet 的映射信息
     * "/"  代表拦截所有请求: 包括静态资源,但是不拦截 *.jsp
     * "/*" 也是拦截所有请求,也拦截 *.jsp
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

指定两个类,一个是根容器的配置类,另一个是 Web 容器的配置类,两个容器是父子容器的关系。

根容器只扫描所有的 ServiceRepository 组件,所以要排除 Controller

代码语言:javascript
复制
@ComponentScan(value = "top.wsuo", excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})
public class RootConfig {
}

而 Web 容器只扫描 Controller

代码语言:javascript
复制
@ComponentScan(value = "top.wsuo", includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class ServletConfig {
}

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2g2deaym94lc8

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档