<div id="article_content" class="article_content csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
<link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/htmledit_views-b569b0e3ef.css">
<div class="htmledit_views">
<p><span style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;text-indent:28px;background-color:rgb(248,248,248);">如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。</span></p>
<p><span style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;text-indent:28px;background-color:rgb(248,248,248);"></span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
ApplicationContext类体系结构</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件</p>
<img src="http://images.51cto.com/files/uploadimg/20120301/125543616.jpg" alt=""><br><p><span style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;text-indent:28px;background-color:rgb(248,248,248);"></span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
和BeanFactory初始化相似,ApplicationContext的初始化也很简单,如果配置文件放置在类路径下,用户可以优先使用ClassPathXmlApplicationContext实现类:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
<span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"><span style="margin:0px;padding:0px;border:none;background-color:inherit;">ApplicationContext </span><span class="attribute" style="margin:0px;padding:0px;border:none;color:#FF0000;background-color:inherit;">ctx</span><span style="margin:0px;padding:0px;border:none;background-color:inherit;"> = </span></span><span class="attribute-value" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#0000FF;background-color:inherit;">new</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml")</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-family:'Courier New';">对于ClassPathXmlApplicationContext来说,"com/baobaotao/context/beans.xml"等同于"classpath: com/baobaotao/context/beans.xml"。</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-size:14px;"><span style="font-family:'Courier New';">如果配置文件放置在文件系统的路径下,则可以优先考虑使用FilySystemXmlApplicationContext实现类:</span> </span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"><span style="margin:0px;padding:0px;border:none;background-color:inherit;">ApplicationContext </span><span class="attribute" style="margin:0px;padding:0px;border:none;color:#FF0000;background-color:inherit;">ctx</span><span style="margin:0px;padding:0px;border:none;background-color:inherit;"> =</span></span><span class="attribute-value" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#0000FF;background-color:inherit;">new</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");
</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-family:'Courier New', monospace;white-space:pre;background-color:inherit;">对于FileSystemXmlApplicationContext来说,“com/baobaotao/context/beans.xml”等同于“file:com/baobaotao/context/beans.xml”。</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
</p>
<p> 还可以指定一组配置文件,Spring会自动将多个配置文件在内存中"整合"成一个配置文件,如下所示:</p>
<p><span style="margin:0px;padding:0px;border:none;background-color:inherit;"><span style="margin:0px;padding:0px;border:none;background-color:inherit;"><span style="font-family:'Courier New', monospace;"><span style="white-space:pre;">ApplicationContext </span></span></span><span class="attribute" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#FF0000;background-color:inherit;">ctx</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> = </span><span class="attribute-value" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#0000FF;background-color:inherit;">new</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> ClassPathXmlApplicationContext(</span></span><span style="font-family:'Courier New', monospace;white-space:pre;background-color:inherit;">new String[]{"conf/beans1.xml","conf/beans2.xml"});</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
当然FileSystemXmlApplicationContext和ClassPathXmlApplicationContext都可以显式使用带资源类型(classpath:或file:)前缀的路径,它们的区别在于如果不显式指定资源类型前缀,将分别将路径解析为文件系统路径和类路径罢了。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有"第一次惩罚"的问题。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext类体系结构</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作。从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文。Spring专门为此提供一个工具类WebApplicationContextUtils,通过该类的getWebApplicationContext(ServletContext
sc)方法,即可以从ServletContext中获取WebApplicationContext实例。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
<img src="http://images.51cto.com/files/uploadimg/20120301/130051206.jpg" alt=""><br></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
由于Web应用比一般的应用拥有更多的特性,因此WebApplicationContext扩展了ApplicationContext。WebApplicationContext定义了一个常量ROOT_WEB_APPLICATION_ CONTEXT_ATTRIBUTE,在上下文启动时,WebApplicationContext实例即以此为键放置在ServletContext的属性列表中,因此我们可以直接通过以下语句从Web容器中获取WebApplicationContext:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
这正是我们前面所提到的WebApplicationContextUtils工具类getWebApplicationContext (ServletContext sc)方法的内部实现方式。这样Spring的Web应用上下文和Web容器的上下文就可以实现互访,二者实现了融合(图3-10):<br style="clear:both;"></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
</p>
<table class="ln" cellspacing="0" align="center" border="1" style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;"><tbody><tr><td bgcolor="#ffffff" style="margin:0px;padding:0px;"><a href="http://images.51cto.com/files/uploadimg/20120301/1252470.jpg" style="color:rgb(0,66,118);text-decoration:none;" target="_blank"></a><a href="http://images.51cto.com/files/uploadimg/20120301/130140625.jpg" style="color:rgb(0,66,118);text-decoration:none;" target="_blank"><img class="fit-image" height="117" alt="" src="http://images.51cto.com/files/uploadimg/20120301/130140625.jpg" width="430" border="0" style="border:medium none;"></a> <a href="http://images.51cto.com/files/uploadimg/20060921/153223104.gif" style="color:rgb(0,66,118);text-decoration:none;" target="_blank"></a></td>
</tr><tr><td class="it" bgcolor="#dddddd" style="margin:0px;padding:0px;">图3-10 Spring和Web应用的上下文融合</td>
</tr></tbody></table><br><p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext初始化</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext的初始化方式和BeanFactory、ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说它必须在拥有Web容器的前提下才能完成启动的工作。有过Web开发经验的读者都知道可以在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener),借助这两者中的任何一个,我们就可以完成启动Spring Web应用上下文的工作。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
所有版本的Web容器都可以定义自启动的Servlet,但只有Servlet 2.3及以上版本的Web容器才支持Web容器监听器。有些即使支持Servlet 2.3 的Web服务器,但也不能在Servlet初始化之前启动Web监听器,如Weblogic 8.1、WebSphere 5.x、Oracle OC4J 9.0。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
Spring分别提供了用于启动WebApplicationContext的Servlet和Web容器监听器:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
org.springframework.web.context.ContextLoaderServlet;</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
org.springframework.web.context.ContextLoaderListener。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
两者的内部都实现了启动WebApplicationContext实例的逻辑,我们只要根据Web容器的具体情况选择两者之一,并在web.xml中完成配置就可以了。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
下面是使用ContextLoaderListener启动WebApplicationContext的具体配置:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
代码清单3-22 通过Web容器监听器引导</p>
<pre style="margin-top:0px;margin-bottom:1em;padding:0px;color:rgb(51,51,51);font-family:'Courier New', monospace;overflow:auto;line-height:28px;background:rgb(230,230,230);"></pre><ol class="dp-xml" style="margin-left:55px;padding:5px 0px;color:rgb(92,92,92);border:none;margin-top:0px !important;margin-right:0px !important;margin-bottom:1px !important;background:rgb(247,247,247);"><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">… </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--①指定配置文件--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">contextConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> /WEB-INF/baobaotao-dao.xml, /WEB-INF/baobaotao-service.xml </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--②声明Web容器监听器--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.context.ContextLoaderListener </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li></ol>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
ContextLoaderListener通过Web容器上下文参数contextConfigLocation获取Spring配置文件的位置。用户可以指定多个配置文件,用逗号、空格或冒号分隔均可。对于未带资源类型前缀的配置文件路径,WebApplicationContext默认这些路径相对于Web的部署根路径。当然,我们可以采用带资源类型前缀的路径配置,如"classpath*:/baobaotao-*.xml"和上面的配置是等效的。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
如果在不支持容器监听器的低版本Web容器中,我们可采用ContextLoaderServlet完成相同的工作:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
代码清单3-23 通过自启动的Servlet引导<br style="clear:both;"></p>
<pre style="margin-top:0px;margin-bottom:1em;padding:0px;color:rgb(51,51,51);font-family:'Courier New', monospace;overflow:auto;line-height:28px;background:rgb(230,230,230);"></pre><ol class="dp-xml" style="margin-left:55px;padding:5px 0px;color:rgb(92,92,92);border:none;margin-top:0px !important;margin-right:0px !important;margin-bottom:1px !important;background:rgb(247,247,247);"><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">… </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">contextConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">/WEB-INF/baobaotao-dao.xml, /WEB-INF/baobaotao-service.xml </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">… </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--①声明自动启动的Servlet --></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">springContextLoaderServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.context.ContextLoaderServlet </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--②启动顺序--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">1</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li></ol>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
由于WebApplicationContext需要使用日志功能,用户可以将Log4J的配置文件放置到类路径WEB-INF/classes下,这时Log4J引擎即可顺利启动。如果Log4J配置文件放置在其他位置,用户还必须在web.xml指定Log4J配置文件位置。Spring为启用Log4J引擎提供了两个类似于启动WebApplicationContext的实现类:Log4jConfigServlet和Log4jConfigListener,不管采用哪种方式都必须保证能够在装载Spring配置文件前先装载Log4J配置信息。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
代码清单3-24 指定Log4J配置文件时启动Spring Web应用上下文</p>
<pre style="margin-top:0px;margin-bottom:1em;padding:0px;color:rgb(51,51,51);font-family:'Courier New', monospace;overflow:auto;line-height:28px;background:rgb(230,230,230);"></pre><ol class="dp-xml" style="margin-left:55px;padding:5px 0px;color:rgb(92,92,92);border:none;margin-top:0px !important;margin-right:0px !important;margin-bottom:1px !important;background:rgb(247,247,247);"><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;background-color:inherit;"> </span></span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">contextConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> /WEB-INF/baobaotao-dao.xml,/WEB-INF/baobaotao-service.xml </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--①指定Log4J配置文件位置--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">log4jConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">/WEB-INF/log4j.properties</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--②装载Log4J配置文件的自启动Servlet --></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">log4jConfigServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.util.Log4jConfigServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">1</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> springContextLoaderServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.context.ContextLoaderServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">2</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li></ol>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
注意上面我们将log4jConfigServlet的启动顺序号设置为1,而springContextLoaderServlet的顺序号设置为2。这样,前者将先启动,完成装载Log4J配置文件初始化Log4J引擎的工作,紧接着后者再启动。如果使用Web监听器,则必须将Log4jConfigListener放置在ContextLoaderListener的前面。采用以上的配置方式Spring将自动使用XmlWebApplicationContext启动Spring容器,即通过XML文件为Spring容器提供Bean的配置信息。</p>
<br><br> </div>
<script>
$(".MathJax").remove();
</script>
<script type="text/javascript" src="//static.blog.csdn.net/mdeditor/public/res/bower-libs/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
</div>
<link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/htmledit_views-b569b0e3ef.css">
<div class="htmledit_views">
<p><span style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;text-indent:28px;background-color:rgb(248,248,248);">如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。</span></p>
<p><span style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;text-indent:28px;background-color:rgb(248,248,248);"></span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
ApplicationContext类体系结构</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件</p>
<img src="http://images.51cto.com/files/uploadimg/20120301/125543616.jpg" alt=""><br><p><span style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;text-indent:28px;background-color:rgb(248,248,248);"></span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
和BeanFactory初始化相似,ApplicationContext的初始化也很简单,如果配置文件放置在类路径下,用户可以优先使用ClassPathXmlApplicationContext实现类:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
<span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"><span style="margin:0px;padding:0px;border:none;background-color:inherit;">ApplicationContext </span><span class="attribute" style="margin:0px;padding:0px;border:none;color:#FF0000;background-color:inherit;">ctx</span><span style="margin:0px;padding:0px;border:none;background-color:inherit;"> = </span></span><span class="attribute-value" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#0000FF;background-color:inherit;">new</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> ClassPathXmlApplicationContext("com/baobaotao/context/beans.xml")</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-family:'Courier New';">对于ClassPathXmlApplicationContext来说,"com/baobaotao/context/beans.xml"等同于"classpath: com/baobaotao/context/beans.xml"。</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-size:14px;"><span style="font-family:'Courier New';">如果配置文件放置在文件系统的路径下,则可以优先考虑使用FilySystemXmlApplicationContext实现类:</span> </span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"><span style="margin:0px;padding:0px;border:none;background-color:inherit;">ApplicationContext </span><span class="attribute" style="margin:0px;padding:0px;border:none;color:#FF0000;background-color:inherit;">ctx</span><span style="margin:0px;padding:0px;border:none;background-color:inherit;"> =</span></span><span class="attribute-value" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#0000FF;background-color:inherit;">new</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> FileSystemXmlApplicationContext("com/baobaotao/context/beans.xml");
</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
<span style="font-family:'Courier New', monospace;white-space:pre;background-color:inherit;">对于FileSystemXmlApplicationContext来说,“com/baobaotao/context/beans.xml”等同于“file:com/baobaotao/context/beans.xml”。</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
</p>
<p> 还可以指定一组配置文件,Spring会自动将多个配置文件在内存中"整合"成一个配置文件,如下所示:</p>
<p><span style="margin:0px;padding:0px;border:none;background-color:inherit;"><span style="margin:0px;padding:0px;border:none;background-color:inherit;"><span style="font-family:'Courier New', monospace;"><span style="white-space:pre;">ApplicationContext </span></span></span><span class="attribute" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#FF0000;background-color:inherit;">ctx</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> = </span><span class="attribute-value" style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;color:#0000FF;background-color:inherit;">new</span><span style="font-family:'Courier New', monospace;white-space:pre;margin:0px;padding:0px;border:none;background-color:inherit;"> ClassPathXmlApplicationContext(</span></span><span style="font-family:'Courier New', monospace;white-space:pre;background-color:inherit;">new String[]{"conf/beans1.xml","conf/beans2.xml"});</span></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
当然FileSystemXmlApplicationContext和ClassPathXmlApplicationContext都可以显式使用带资源类型(classpath:或file:)前缀的路径,它们的区别在于如果不显式指定资源类型前缀,将分别将路径解析为文件系统路径和类路径罢了。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean。因此ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有"第一次惩罚"的问题。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;text-indent:28px;background-color:transparent;">
</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext类体系结构</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作。从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文。Spring专门为此提供一个工具类WebApplicationContextUtils,通过该类的getWebApplicationContext(ServletContext
sc)方法,即可以从ServletContext中获取WebApplicationContext实例。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
<img src="http://images.51cto.com/files/uploadimg/20120301/130051206.jpg" alt=""><br></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
由于Web应用比一般的应用拥有更多的特性,因此WebApplicationContext扩展了ApplicationContext。WebApplicationContext定义了一个常量ROOT_WEB_APPLICATION_ CONTEXT_ATTRIBUTE,在上下文启动时,WebApplicationContext实例即以此为键放置在ServletContext的属性列表中,因此我们可以直接通过以下语句从Web容器中获取WebApplicationContext:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
这正是我们前面所提到的WebApplicationContextUtils工具类getWebApplicationContext (ServletContext sc)方法的内部实现方式。这样Spring的Web应用上下文和Web容器的上下文就可以实现互访,二者实现了融合(图3-10):<br style="clear:both;"></p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
</p>
<table class="ln" cellspacing="0" align="center" border="1" style="color:rgb(51,51,51);font-family:'宋体';font-size:14px;line-height:28px;"><tbody><tr><td bgcolor="#ffffff" style="margin:0px;padding:0px;"><a href="http://images.51cto.com/files/uploadimg/20120301/1252470.jpg" style="color:rgb(0,66,118);text-decoration:none;" target="_blank"></a><a href="http://images.51cto.com/files/uploadimg/20120301/130140625.jpg" style="color:rgb(0,66,118);text-decoration:none;" target="_blank"><img class="fit-image" height="117" alt="" src="http://images.51cto.com/files/uploadimg/20120301/130140625.jpg" width="430" border="0" style="border:medium none;"></a> <a href="http://images.51cto.com/files/uploadimg/20060921/153223104.gif" style="color:rgb(0,66,118);text-decoration:none;" target="_blank"></a></td>
</tr><tr><td class="it" bgcolor="#dddddd" style="margin:0px;padding:0px;">图3-10 Spring和Web应用的上下文融合</td>
</tr></tbody></table><br><p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext初始化</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
WebApplicationContext的初始化方式和BeanFactory、ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说它必须在拥有Web容器的前提下才能完成启动的工作。有过Web开发经验的读者都知道可以在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener),借助这两者中的任何一个,我们就可以完成启动Spring Web应用上下文的工作。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
所有版本的Web容器都可以定义自启动的Servlet,但只有Servlet 2.3及以上版本的Web容器才支持Web容器监听器。有些即使支持Servlet 2.3 的Web服务器,但也不能在Servlet初始化之前启动Web监听器,如Weblogic 8.1、WebSphere 5.x、Oracle OC4J 9.0。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
Spring分别提供了用于启动WebApplicationContext的Servlet和Web容器监听器:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
org.springframework.web.context.ContextLoaderServlet;</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
org.springframework.web.context.ContextLoaderListener。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
两者的内部都实现了启动WebApplicationContext实例的逻辑,我们只要根据Web容器的具体情况选择两者之一,并在web.xml中完成配置就可以了。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
下面是使用ContextLoaderListener启动WebApplicationContext的具体配置:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
代码清单3-22 通过Web容器监听器引导</p>
<pre style="margin-top:0px;margin-bottom:1em;padding:0px;color:rgb(51,51,51);font-family:'Courier New', monospace;overflow:auto;line-height:28px;background:rgb(230,230,230);"></pre><ol class="dp-xml" style="margin-left:55px;padding:5px 0px;color:rgb(92,92,92);border:none;margin-top:0px !important;margin-right:0px !important;margin-bottom:1px !important;background:rgb(247,247,247);"><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">… </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--①指定配置文件--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">contextConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> /WEB-INF/baobaotao-dao.xml, /WEB-INF/baobaotao-service.xml </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--②声明Web容器监听器--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.context.ContextLoaderListener </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">listener</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li></ol>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
ContextLoaderListener通过Web容器上下文参数contextConfigLocation获取Spring配置文件的位置。用户可以指定多个配置文件,用逗号、空格或冒号分隔均可。对于未带资源类型前缀的配置文件路径,WebApplicationContext默认这些路径相对于Web的部署根路径。当然,我们可以采用带资源类型前缀的路径配置,如"classpath*:/baobaotao-*.xml"和上面的配置是等效的。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
如果在不支持容器监听器的低版本Web容器中,我们可采用ContextLoaderServlet完成相同的工作:</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
代码清单3-23 通过自启动的Servlet引导<br style="clear:both;"></p>
<pre style="margin-top:0px;margin-bottom:1em;padding:0px;color:rgb(51,51,51);font-family:'Courier New', monospace;overflow:auto;line-height:28px;background:rgb(230,230,230);"></pre><ol class="dp-xml" style="margin-left:55px;padding:5px 0px;color:rgb(92,92,92);border:none;margin-top:0px !important;margin-right:0px !important;margin-bottom:1px !important;background:rgb(247,247,247);"><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">… </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">contextConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">/WEB-INF/baobaotao-dao.xml, /WEB-INF/baobaotao-service.xml </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">… </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--①声明自动启动的Servlet --></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">springContextLoaderServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.context.ContextLoaderServlet </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--②启动顺序--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">1</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li></ol>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
由于WebApplicationContext需要使用日志功能,用户可以将Log4J的配置文件放置到类路径WEB-INF/classes下,这时Log4J引擎即可顺利启动。如果Log4J配置文件放置在其他位置,用户还必须在web.xml指定Log4J配置文件位置。Spring为启用Log4J引擎提供了两个类似于启动WebApplicationContext的实现类:Log4jConfigServlet和Log4jConfigListener,不管采用哪种方式都必须保证能够在装载Spring配置文件前先装载Log4J配置信息。</p>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
代码清单3-24 指定Log4J配置文件时启动Spring Web应用上下文</p>
<pre style="margin-top:0px;margin-bottom:1em;padding:0px;color:rgb(51,51,51);font-family:'Courier New', monospace;overflow:auto;line-height:28px;background:rgb(230,230,230);"></pre><ol class="dp-xml" style="margin-left:55px;padding:5px 0px;color:rgb(92,92,92);border:none;margin-top:0px !important;margin-right:0px !important;margin-bottom:1px !important;background:rgb(247,247,247);"><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;background-color:inherit;"> </span></span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">contextConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> /WEB-INF/baobaotao-dao.xml,/WEB-INF/baobaotao-service.xml </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--①指定Log4J配置文件位置--></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">log4jConfigLocation</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">/WEB-INF/log4j.properties</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">param-value</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">context-param</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="comments" style="margin:0px;padding:0px;border:none;color:rgb(0,130,0);background-color:inherit;"><!--②装载Log4J配置文件的自启动Servlet --></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">log4jConfigServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.util.Log4jConfigServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">1</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> springContextLoaderServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-name</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">org.springframework.web.context.ContextLoaderServlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet-class</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li style="list-style:decimal outside;border:none;line-height:18px;margin:0px !important;padding:0px 3px 0px 10px !important;"><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"><</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">2</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">load-on-startup</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li><li class="alt" style="margin:0px !important;padding:0px 3px 0px 10px !important;color:inherit;list-style:decimal outside;border:none;line-height:18px;"><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;"></</span><span class="tag-name" style="margin:0px;padding:0px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">servlet</span><span class="tag" style="margin:0px 0px 10px;padding:7px 0px 4px;border:none;color:rgb(0,102,153);font-weight:bold;background-color:inherit;">></span><span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;"> </span></li></ol>
<p style="margin-top:10px;margin-bottom:10px;padding-top:0px;padding-bottom:0px;color:rgb(51,51,51);text-indent:28px;font-family:'宋体';font-size:14px;line-height:28px;background-color:rgb(248,248,248);">
注意上面我们将log4jConfigServlet的启动顺序号设置为1,而springContextLoaderServlet的顺序号设置为2。这样,前者将先启动,完成装载Log4J配置文件初始化Log4J引擎的工作,紧接着后者再启动。如果使用Web监听器,则必须将Log4jConfigListener放置在ContextLoaderListener的前面。采用以上的配置方式Spring将自动使用XmlWebApplicationContext启动Spring容器,即通过XML文件为Spring容器提供Bean的配置信息。</p>
<br><br> </div>
<script>
$(".MathJax").remove();
</script>
<script type="text/javascript" src="//static.blog.csdn.net/mdeditor/public/res/bower-libs/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
</div>