zoukankan      html  css  js  c++  java
  • servlet3.0之后加入spring-mvc

    1 ServletContainerInitializer

    servlet 3.0之后,三大组件(Filter, ServletListener)的注册可以不用通过web.xml进行注册,使用注解的当时就可以了。

    原因就是新增了一个ServletContainerInitializer 接口,主要用于在容器启动阶段通过编程风格注册Filter, Servlet以及Listener,以取代通过web.xml配置注册。这样就利于开发内聚的web应用框架。那么web.xml中用来配置spring的一些配置也可以不采用web.xml的方式了。这样就相当于将框架和容器紧耦合了。而在3.x后注册的功能内聚到Spring里,Spring-web就变成一个纯粹的即插即用的组件,不用依据应用环境定义一套新的配置。

    Tomcat 是一个开源软件,实现了 java Servlet规范、java Servlet Pages技术,不同版本的Tomcat 支持不同的serlet和JSP 规范。自从Tomcat7之后开始支持servlet 3.0。也就是说tomcat7之后的版本可以使用ServletContainerInitializer接口。

    在tomcat7之后的版本之后,servletContainer启动时都会去执行ServletContainerInitializer接口的实现类。

    Tomcat如何是发现ServletContainerInitializer的实现类呢? 答案就是SPI机制,通过配置文件与约定配置文件明的方式来实现。

    2 SpringServletContainerInitializer

    SpringServletContainerInitializer是ServletContainerInitializer的一个实现类,在spring-web.xxx.jar下有一个如下图的配置文件

    这样tomcat在启动时就可以发现SpringServletContainerInitializer类,并执行里面的代码
    package org.springframework.web;
    
    import java.lang.reflect.Modifier;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.ServiceLoader;
    import java.util.Set;
    import javax.servlet.ServletContainerInitializer;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.HandlesTypes;
    
    import org.springframework.core.annotation.AnnotationAwareOrderComparator;
    
    
    @HandlesTypes(WebApplicationInitializer.class)
    public class SpringServletContainerInitializer implements ServletContainerInitializer {
    
        
        @Override
        public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
                throws ServletException {
    
            List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
    
            if (webAppInitializerClasses != null) {
                for (Class<?> waiClass : webAppInitializerClasses) {
                    // Be defensive: Some servlet containers provide us with invalid classes,
                    // no matter what @HandlesTypes says...
                    if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
                            WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
                        try {
                            initializers.add((WebApplicationInitializer) waiClass.newInstance());
                        }
                        catch (Throwable ex) {
                            throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
                        }
                    }
                }
            }
    
            if (initializers.isEmpty()) {
                servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
                return;
            }
    
            servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
            AnnotationAwareOrderComparator.sort(initializers);
            for (WebApplicationInitializer initializer : initializers) {
                initializer.onStartup(servletContext);
            }
        }
    
    }

    3 @HandlesTypes(WebApplicationInitializer.class)

    @HandlesTypes注解的作用:他的作用是将注解指定的Class对象作为参数传递到onStartup(ServletContainerInitializer)方法中。注解的实现机制还不懂。

    那么配置spring-mvc的配置项都可以在这个WebApplicationInitializer接口的实现类中进行。也就是说,tomcat一启动就是执行WebApplicationInitializer接口实现类的 void onStartup(ServletContext servletContext) throws ServletException;方法

     
  • 相关阅读:
    今天学到的新知识自己的电脑可以像Github Pages、码云 Pages一样发布静态资源
    移动端安卓开发学习记录Android Studio打断点调试操作步骤记录
    图文并茂学习记录从零开始进行微信小程序开发+引入Vant Weapp组件
    代码小DEMO随笔JS原生手机版本alert弹框
    移动端安卓开发学习记录Android Studio使用adb链接夜神模拟器常用指令
    图文并茂的学习笔记微信小程序自定义tabbar
    解决微信小程序 自定义tabBar 切换时候闪烁问题
    App扫码登录
    TypeScript 参数简化实战(进阶知识点conditional types) 广东靓仔
    前端进阶指南(优秀文章) 广东靓仔
  • 原文地址:https://www.cnblogs.com/cplinux/p/12312496.html
Copyright © 2011-2022 走看看