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

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

1、Spring

<!-- system-config -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<!-- spring-application -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:/spring/**/spring-*.xml
			classpath:applicationContext.xml
			classpath:applicationContext-activiti.xml
			classpath:applicationContext-mybatis.xml
			classpath:applicationContext-solr.xml
			classpath:applicationContext-task.xml
		</param-value>
	</context-param>

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中<context-param>的<param-name>中找contextClass,看是否有指定某个class 
如果没有指定,就是默认用XmlWebApplicationContext
如果有指定,则载入对应的class
然后根据Class实例化对象,生成一个WebApplicationContext(默认一般都是XmlWebApplicationContext)
configureAndRefreshWebApplicationContext(cwac, servletContext),cwac就是刚才创建的XmlWebApplicationContext对象,将servletContext中的配置信息<param-name>contextConfigLocation</param-name>导入到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映射成一个 普通类。极大的简化了开发。

<servlet>
		<servlet-name>springServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值