这里整理一下博主自己学习Spring对于过程的理解,整理一下思路。
大致流程,以及对红字的介绍。
第一步:
Servlet容器启动时会扫描当前应用里面的每一个jar包,找到其中的META-INF/services/javax.servlet.ServletContainerInitializer文件,该只存放实现了ServletContainerInitializer的类的全类名,并加载这个文件的所写的类。
Servlet容器:一般指tomcat容器,其他容器博主尚且不知。
当前应用:我们创建的每一个工程。
META-INF/services/javax.servlet.ServletContainerInitializer:
(1)在Spring的Spring-web-x.x.xx.RELEASE.jar包中存在这个文件。文件的内容是org.springframework.web.SpringSerlvetContainerInitializer【很明显继承自ServletContainerInitializer】的全类名。
(2)实现ServletContainerInitializer的类需要实现如下:
//注解写在类上,容器启动时,会将这个指定的子类以及子接口等传递给该函数的第一个参数webAppInitializerClasses
@HandlesTypes({})
//类需要实现的方法
//webAppInitializerClasses同上
//servletContext当前WEB应用的环境(上下文)
/*
* ServletContext只在两个地方添加组件:
* 1、在ServletContainerInitializer的onStartup的参数中
* 2、在Listener的contextDestoryed或contextInitialized的参数Event.getServletContext。
*/
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
(3)SpringSerlvetContainerInitializer实现了什么功能?
①、HandlesTypes=(WebApplicationInitializer.class)
②、判断webAppInitializerClasses(上面的第一个参数)中的元素是否为接口或抽象类
③、如果不是,就通过反射的方式,创建类
(4)WebApplicationInitializer是什么?
①、继承关系如下:
|--WebApplicationInitializer(接口,定义各种方法)
|--AbstractContextLoaderInitializer(抽象类,创建RootApplicationContext根容器)
|--AbstractDispatherServletInitializer(抽象类,创建DispatherServlet,他的映射通过getServletMappings()创建,而我 们可以实现该方法,覆盖该方法,写映射)
|--AbstractAnnotationConfigDispatherServletInitializer(抽象类,利用注解的方式创建DispatherServlet,重写了上面的两个抽象类的方法)
(5)WebApplicationContext 和 RootWebApplicationContext关系?
其实就一样的东西,只是每一个存放的东西不太一样。
第二步:
继承AbstractAnnotationConfigDispatherServletInitializer,并实现相应的抽象方法,我们实现的方法, 会通过上一步的流程,自动的创建并生成DispatcherServlet容器。
需要实现的方法如下:
/*
* 这个方法暂时不知道详情。
*/
@Bean
@RequestMapping("*.do")
public DispatcherServlet dispatcherServlet() {
DispatcherServlet servlet = new DispatcherServlet();
return servlet;
}
/*
* 根据上面一个图,应该很好的展示了,这个方法,返回的是Services和Repositories这一层的类。
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
/*
* 返回的是用Controlers、viewResolver和HandlerMapping这一层的类。
*/
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}
/*
* 返回的是,当前这个DispatcherServlet的拦截配置
*/
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return null;
}