作为一个合格的程序员,今天第一次写博客
在昨天从网上找了一个帖子。做了一个最简单的springmvc+spring的框架项目。
我以前是弄ssh框架的,换了一个框架就要好好看一看。
所有的web项目都是从web.xml开始启动(有人说从tomcat启动也可以,顺带说一句当我们用tomcat部署时,会把所有部署在tomcat中的项目的web.xml文件都读一遍。所以在start一个新项目时最好把以前的项目关掉,好处以后讲)
换汤不换药还是这几样:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
当读到这里时会初始化spring的根容器,这个容器是用来自动装配ApplicationContext.xml的配置信息,其实spring的自动注入(DI)就是从这里开始的。
如果大家留意项目刚刚启动的信息(就是console下的那些红色信息),当tomcat启动之后,它会跳出这样的句话:
信息: Initializing Spring root WebApplicationContext
二月 16, 2015 2:26:11 下午 org.springframework.web.context.ContextLoader initWebApplicationContext
信息: Root WebApplicationContext: initialization started
二月 16, 2015 2:26:11 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing Root WebApplicationContext: startup date [Mon Feb 16 14:26:11 CST 2015]; root of context hierarchy
二月 16, 2015 2:26:11 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
二月 16, 2015 2:26:12 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@26dd85: defining beans [dataSource]; root of factory hierarchy
二月 16, 2015 2:26:12 下午 org.springframework.web.context.ContextLoader initWebApplicationContext
信息: Root WebApplicationContext: initialization completed in 325 ms
->Initializing Spring root WebApplicationContext(spring容器正在初始化)
->initialization started(初始化开始),这时如果可以打breakpoint的话,spring-web的jar包下面(我用的是 3.0.5的版本)
回头一看既然有一个叫ContextLoaderListener的类,打开一看豁然开朗,这个了继承的ContextLoader类,实现的ServletContextListener接口。这就是设计者有意思的地方,ServletContextListener在监听到在tomcat启动就将执行contextInitialized()这个方法。而在ContextLoaderListener()中重写的里面的方法。在监听到tomcat启动之后立马让ContextLoader去初始化WebApplicationContext,然后创建WebApplicationContext
在ContextLoader类中会看到“contextConfigLocation”这样熟悉字符串,这也解释的为什么在web.xml中这些参数不能写错:在最底层用的是反射。
->prepareRefresh(准备生产)在这里我们可以在AbstractApplicationContext中看到开始有beanfactor,具体在这个类下:
->loadBeanDefinitions(解析ApplicationContext.xml生成dom,在用dom得到bean配置)
->preInstantiateSingletons(开始创建beans,并且是单列的,同时注入spring容器)
->WebApplicationContext: initialization completed(spring容器初始化完成)
其实这些只是大概过程,许多细节没提。如果有不正确的地方欢迎大家指正!qq:1337343005,邮箱: liushaoshuai@airad.com