Web环境中Spring的启动过程

Web环境中Spring的启动过程

Web.xml

这个要从servlet的起源说起,客户发起HTTP请求,web容器(tomcat)就会收到请求,然后根据web.xml的配置信息,根据HTTP的url请求路径,找到相应的servlet去解决[ doGet() or doPost() ]

启动一个WEB项目时,容器首先会读取项目web.xml里面的配置。从里面读两个东西,<listener></listener><context-param></context-param>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

这里面的applicationContext.xml配置Spring的各种东西,主要是bean,ContextLoaderListener是Spring切入到servlet执行过程的入口。

想要用Spring,你可以不写applicationContext.xml,但是一定要带ContextLoaderListener。——D.龙成

  • 首先容器创建一个ServletContext,是这个web项目的上下文。然后把<context-param>这个做成一个键值对给ServletContext。
  • 然后容器会根据<listener>的配置创建一个监听器,监听器中会有contextInitialized(ServletContextEvent args)初始化方法,在启动Web应用时,系统调用listener的该方法,获得
    ServletContext application =ServletContextEvent.getServletContext();
    context-param的值= application.getInitParameter(“context-param的键”);
  • 所以如果你想在项目启动之前搞事(比如初始化数据库的连接),那就可以在<context-param>设置数据库的连接参数(在ApplicationContext.xml中写好驱动,url,user,password,设置可以在xml里面写个代号,然后从property里面读,设置property可以用zookeeper搞个配置中心从网上拿。。。),然后在监听器的初始化方法中初始化数据库的连接,销毁时关闭连接。
  • web.xml总体的加载顺序为<context-param> -> <listener> -> <filter> -> <servlet>

Spring

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
  • 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容器中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值