Spring与Servlet3.0

Servlet3.0

tomcat7.0+

一.支持注解

  1. @WebServlet(..)
  2. @WebListener(..)
  3. @WebFilter(..)
  4. @WebInitParam(..)

...

二.插件能力

tomcat启动时

META/services/javax.servlet.ServletContainerInitializer文件 -> 实现类全路径

@HandlesTypes(Class<?> clazz)		//感兴趣的实现类
public class XxxServletContainerInitializer implements ServletContainerInitialize{
    @Override
	public void onStartup(@Nullable Set<Class<?>> clazz, ServletContext sc){
        // 可以在这注册Servlet,Listener,Filter组件
        sc.addServlet(..)
    }
}

三.SpringMVC与Servlet

SpringMVC整合Servlet

SpringServletContainerInitializer 是SpringWeb实现的ServletContainerInitializer

@HandlesTypes(WebApplicationInitializer.class) // 感兴趣的类
public class SpringServletContainerInitializer implements ServletContainerInitializer {}

WebApplicationInitializer

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //提供了有层级的父子容器

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { App1Config.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/app1/*" };
    }
}

Way1.自己new DispatcherServlet(类似Servlet2.5 XML)

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

Way2.使用父子容器的配置

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { App1Config.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/app1/*" };
    }
}

同作用的XML

<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>app1</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/app1-context.xml</param-value> !!//子容器 不配置等同于way1,配置等同于way2
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app1</servlet-name>
        <url-pattern>/app1/*</url-pattern>
    </servlet-mapping>

</web-app>

四.Springboot与Servlet

Spring Boot follows a different initialization sequence. Rather than hooking into the lifecycle of the Servlet container, Spring Boot uses Spring configuration to bootstrap itself and the embedded Servlet container. Filter and Servlet declarations are detected in Spring configuration and registered with the Servlet container. For more details, see the Spring Boot documentation.

翻一下:

SpringBoot遵循不同的初始化顺序,没有挂钩到Servlet的生命周期,而是使用Spring配置来引导自身和嵌入式Servlet容器,FilterServlet声明在 Spring 配置中检测并注册到 Servlet 容器。

posted @ 2021-11-18 00:18  AugustFire  阅读(84)  评论(0)    收藏  举报