从web.xml开始以及延伸出来的问题
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:/spring/**/spring-*.xml
classpath:applicationContext.xml
classpath:applicationContext-activiti.xml
classpath:applicationContext-mybatis.xml
classpath:applicationContext-solr.xml
classpath:applicationContext-task.xml
Spring在Web环境中通过ContextLoaderListener监听器类启动(Spring自己搞的一个监听器类),通过加载“/WEB-INF/”目录下的Spring配置文件(Spring的相关配置文件ApplicationContext.xml),Web服务器启动Spring的初始化过程。这样通过Spring自己搞的监听器类,搭配上跟Spring相关的配置文件,就完成了Spring的一些东西嵌入到web项目里的任务。
ContextLoaderListener继承Spring的ContextLoader上下文加载器类——管理Spring的启动和销毁,实现ServletContextListener接口(Servlet上下文监听器)——监听Web服务器上下文的启动和停止事件。
Web应用启动和停止时,Web服务器会触发ServletContextListener接口的两个方法,这两个方法就会通过ContextLoader启动和销毁Spring的上下文。
contextInitialized()这个方法首先是执行this.contextLoader.initWebApplicationContext(event.getServletContext()),调用 createWebApplicationContext()建了一个WebApplicationContext(IOC容器)
createWebApplicationContext()会调用determineContextClass(sc)
determineContextClass(sc)会决定到底用哪个WebApplicationContext的类,首先从web.xml中
如果没有指定,就是默认用XmlWebApplicationContext
如果有指定,则载入对应的class
然后根据Class实例化对象,生成一个WebApplicationContext(默认一般都是XmlWebApplicationContext)
configureAndRefreshWebApplicationContext(cwac, servletContext),cwac就是刚才创建的XmlWebApplicationContext对象,将servletContext中的配置信息
总结一下就是,Spring写了一个listener,把自己和web项目绑在一起了(你web项目初始化,那我就初始化,你销毁,那我就也销毁)所以在web项目启动的时候Spring也会启动,然后从ApplicationContext.xml文件中取出来各种bean,然后把他们载入到自己的IoC容器中。
spring
web.xml
-- > ContextLoaderListener(contextInitialized)
-- >ContextLoader(initWebApplicationContext)
createWebApplicationContext -- >determineContextClass(获取默认IOC XmlWebApplicationContext)
configureAndRefreshWebApplicationContext(加载配置文件 ,转化配置文件信息BeaDefinition,将各种bean加载进IOC容器)
spring的存在就是为了简化开发,springmvc也是一样,在没有mvc框架之前,我们使用的servlet,每 增加一个 模块,需要更改web.xml 添加新的servlet配置, 团队共同维护 xml 代码不健康,mvc,实现自己的一个容器,把用户请求url映射成一个 普通类。极大的简化了开发。
springServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
springServlet
/
web.xml 加载 DispatcherServlet,继承自FrameworkServlet,HttpServletBean,Servlet实际上真正调用的是HttpServletBean.init(), 再调用其initServletBean(),委派给FrameworkServlet实现,
其中最重要的方法是initWebApplicationContext() ,这个方法中主要做了以下几件事情
1、rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());获取父容器:spring容器
2、创建容器:createWebApplicationContext(rootContext),
在这里面调用getContextClass(), configureAndRefreshWebApplicationContext(), 加载配置文件 ,转化配置文件信息BeaDefinition,将各种bean加载进IOC容器
configureAndRefreshWebApplicationContext()--AbstractApplicationContext.refresh()-finishRefresh()-publishEvent(new ContextRefreshedEvent(this));- getApplicationEventMulticaster().multicastEvent(event); - getApplicationEventMulticaster().multicastEvent(event); - ContextRefreshListener.onApplicationEvent() - onRefresh()
委派给DispatcherServlet实现 - initStrategies()
springmvc
web.xml
-- > DispatcherServlet (调用父类 FrameworkServlet中initServletBean方法)
initWebApplicationContext --> createWebApplicationContext
getContextClass (获取默认IOC XmlWebApplicationContext)
configureAndRefreshWebApplicationContext
-->refresh() -- >DispatcherServlet.onRefresh() -- >initStrategies()