从web.xml开始以及延伸出来的问题-spring&mvc启动简析

从web.xml开始以及延伸出来的问题

1、Spring


	
		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中中找contextClass,看是否有指定某个class 
如果没有指定,就是默认用XmlWebApplicationContext
如果有指定,则载入对应的class
然后根据Class实例化对象,生成一个WebApplicationContext(默认一般都是XmlWebApplicationContext)
configureAndRefreshWebApplicationContext(cwac, servletContext),cwac就是刚才创建的XmlWebApplicationContext对象,将servletContext中的配置信息contextConfigLocation导入到XmlWebApplicationContext中,然后就可以进行各种bean初始化了。(更多bean定义的资源文件载入到Spring IoC容器的过程,后续再看Spring IoC容器源码分析)

总结一下就是,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容器)

 

2、SpringMVC

原理:https://www.cnblogs.com/xiaoxi/p/6164383.html

 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()

 

你可能感兴趣的:(spring源码)