SpringMVC
Servlet
- SpringMVC是基于Servlet封装的MVC框架
- Servlet是单例的 在高并发情况下,可能会存在线程安全问题
ServletContainerInitializer
在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。
每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类。
web容器启动会做这样的操作:
1、Servlet容器启动会扫描,当前应用里面每一个jar包的
ServletContainerInitializer的实现
2、提供ServletContainerInitializer的实现类;
必须绑定在,META-INF/services/javax.servlet.ServletContainerInitializer
文件的内容就是ServletContainerInitializer实现类的全类名;
@HandlesTypes(value = MyHandlesType.class)
public class MyServletContainerInitializer implements ServletContainerInitializer {
/**
* @param set 感兴趣类型 也就是MyHandlesType 所有子类型
* @param servletContext
* @throws ServletException
*/
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
// 1.打印所有感兴趣的类型
for (Class<?> c : set) {
System.out.println(c);
}
// 2.servletContext 手动注册过滤器、servlet、监听器
ServletRegistration.Dynamic payServlet = servletContext.addServlet("payServlet", new PayServlet());
payServlet.addMapping("/pay");
}
}
基于注解方式无xml方式启动MVC
@Configuration
@ComponentScan("com.mayikt.controller")
@EnableWebMvc
public class SpringMvcConfig {
//@EnableWebMvc 等于开启SpringMVC注解方式
//@Configuration xml
// @ComponentScan("com.mayikt.controller") mvc 扫包范围
//DispatcherServlet
}
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
// 1.启动SpringMVC 容器 类注入到Spring中
AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();// 启动SpringMVC Web
// 2.注入我们的springmvc 的配置文件
app.register(SpringMvcConfig.class);
// 3. 将我们的DispatcherServlet 注入到 serlvet容器中
ServletRegistration.Dynamic dynamic =
servletContext.addServlet("dispatcher", (Servlet) new DispatcherServlet(app));
// 4.填写url路径映射
dynamic.addMapping("/");
dynamic.setLoadOnStartup(1);// 优先级最高表示 最早被加载
//SpringServletContainerInitializer
}
// 基本配置已经ok呢? web.xml ? 使用WebApplicationInitializer 替代web.xml
//为什么这个类WebInitializer 不需要直接呢? 能够自动的找到该类呢、
}
原理:Sevlet容器在初始化的时候会加载到这个SpringServletContainerInitializer,让后找HandlesTypes子类传 回调传递