Spring与Servlet3.0
Servlet3.0
tomcat7.0+
一.支持注解
- @WebServlet(..)
- @WebListener(..)
- @WebFilter(..)
- @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
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容器,Filter和Servlet声明在 Spring 配置中检测并注册到 Servlet 容器。
本文来自博客园,作者:AugustFire,转载请注明原文链接:https://www.cnblogs.com/august-fire/p/15570307.html

浙公网安备 33010602011771号