Spring webmvc在javaweb3.0以上容器中启动过程解析

一、问题的焦点是什么?

  1. SpringWebMVC提供的DispathcerServlet的类中,并没有@WebServlet的注解
  2. javaweb3.0之前,可以使用web.xml加以注册使用
  3. 但是3.0+,。。。

二、web 容器提供的新类

  1. 名字: javax.servlet.ServletContainerInitializer
  2. 作用:主要用于在容器启动阶段通过编程风格注册Filter, Servlet以及Listener,以取代通过web.xml配置注册。
  3. 使用方式如下:
  • 编码新类:
@HandlesTypes(MyBean.class)//自定义类的子类(只能扫描到子类)
public class MyWebAppInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> myBeanClazzes//自定义的类,将被扫描出来
            , ServletContext ctx) throws ServletException {
        //添加及配置JavaWeb的三大组件
        ctx.addServlet("servlet-name", HttpServlet.class);
//                .setLoadOnStartup(1)
//                .addMapping("/")
//                .setInitParameter("","")
//        ctx.addFilter();
//        ctx.addListener();
    }
}
  • 让容器找到它
    建立文件,名字:
    /META-INF/services/javax.servlet.ServletContainerInitializer
    文件内容:cn.johnyu.MyWebAppInitializer
  • 此时,它将随着容器启动,并回调onStartup方法

三、Spring的实现方案:

  1. 提供了自定义的ContainerInitailizer:
@HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {
  //...
}
  1. 在其中调用了WebApplicationInitializer的方法
          while(var4.hasNext()) {
                WebApplicationInitializer initializer = (WebApplicationInitializer)var4.next();
                initializer.onStartup(servletContext);
            }
  1. 你需要的只是继承WebApplicationInitializer
  2. 问题可以更简单,Spring提供了一个默认的实现AbstractAnnotationConfigDispatcherServletInitializer,你需要的只是实现它的两个方法
   public class MySpringIntializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容