﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-刘文涛-随笔分类-Spring 源码研究</title><link>http://www.blogjava.net/liuwentao253/category/25462.html</link><description>SPRING,设计模式,UML,Oracle</description><language>zh-cn</language><lastBuildDate>Sun, 09 Mar 2008 17:02:36 GMT</lastBuildDate><pubDate>Sun, 09 Mar 2008 17:02:36 GMT</pubDate><ttl>60</ttl><item><title>看SPRING源代码学东西</title><link>http://www.blogjava.net/liuwentao253/archive/2008/03/08/184628.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sat, 08 Mar 2008 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2008/03/08/184628.html</guid><description><![CDATA[&nbsp;- 使用Assert <br />
<p>org.springframework.util.Assert<br />
Assert翻译为中文为"断言".用过JUNIT的应该都知道这个概念了.<br />
就是断定某一个实际的值就为自己预期想得到的,如果不一样就抛出异常.<br />
Assert经常用于:<br />
1.判断METHOD的参数是否属于正常值.<br />
2.JUNIT中使用.</p>
<p>我发现SPRING1.2.6里面有BUG<br />
请看:<br />
org.springframework.core.io.support.EncodedResource中<br />
public EncodedResource(Resource resource, String encoding) {<br />
&nbsp; Assert.notNull("Resource is required");<br />
&nbsp; this.resource = resource;<br />
&nbsp; this.encoding = encoding;<br />
}</p>
<p>Assert.notNull("Resource is required");<br />
这句应该为<br />
Assert.notNull(resource,"Resource is required");<br />
不然resource都没传过来,还断什么言啊,</p>
<br />
-&nbsp;接口的多重继承&nbsp;<br />
<br />
<p>JAVA中类是不充许多重继承的,那么接口呢?一时还真确定不了.拿出SPRING源代码看看..<br />
&nbsp;<br />
ApplicationContext.java<br />
--------------<br />
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,<br />
&nbsp; MessageSource, ApplicationEventPublisher, ResourcePatternResolver {</p>
<p>......<br />
&nbsp;<br />
}<br />
---------------<br />
&nbsp;<br />
呵呵,证明接口是可以多重继承的.SPRING的源代码可真是好东东!<br />
</p>
<a class="Link icon modify center invisible" id="edit" href="javascript:void(0)"><br />
- SpringVersion </a><br />
<br />
<p>先看代码<br />
core包中的SpringVersion.java</p>
<p>public class SpringVersion {<br />
&nbsp;/**<br />
&nbsp; * Return the full Spring version string.<br />
&nbsp; * @see java.lang.Package#getImplementationVersion<br />
&nbsp; */<br />
&nbsp;public static String getVersion() {<br />
&nbsp;&nbsp;return SpringVersion.class.getPackage().getImplementationVersion();<br />
&nbsp;}<br />
}</p>
<p>SpringVersion.class.getPackage().getImplementationVersion();<br />
这一句会返回什么信息呢?我使用得是Spring1.2.6,返回如下信息.<br />
-----<br />
1.2.6<br />
-----<br />
那么这个信息又是从什么地方来的呢?<br />
这个就要说到产品的发布.产品发布会打成一个JAR包.JAR除了包含.class文件外,还包括一个META-INF文件夹.它下面又包含了一个MANIFEST.MF的文件.它包含了这个产品的产品信息.现在看看这个文件里都有什么吧<br />
-----------------------<br />
Manifest-Version: 1.0<br />
Ant-Version: Apache Ant 1.6.5<br />
Created-By: 1.5.0_05-b05 (Sun Microsystems Inc.)<br />
Implementation-Title: Spring Framework<br />
Implementation-Version: 1.2.6<br />
Spring-Version: 1.2.6<br />
-----------------------</p>
<p>现在知道getImplementationVersion()是从哪里取东东了吧:)<br />
</p>
<br />
<br />
-&nbsp;JdkVersion <br />
<br />
<p>在Spring的core包用有一个JdkVersion类.<br />
部分代码:<br />
JdkVersion.java<br />
---------------------<br />
&nbsp;static {<br />
&nbsp; javaVersion = System.getProperty("java.version");<br />
&nbsp; // should look like "1.4.1_02"<br />
&nbsp; if (javaVersion.indexOf("1.4.") != -1) {<br />
&nbsp;&nbsp; majorJavaVersion = JAVA_14;<br />
&nbsp; }<br />
&nbsp; else if (javaVersion.indexOf("1.5.") != -1) {<br />
&nbsp;&nbsp; majorJavaVersion = JAVA_15;<br />
&nbsp; }<br />
&nbsp; // else leave as 1.3 default<br />
&nbsp;}<br />
----------------------<br />
System.getProperty("java.version");<br />
这句是什么呢?看名也能猜出来他是获取JAVA的版本.<br />
顺藤摸瓜,写这样一段代码.<br />
---------------------------<br />
Properties p = System.getProperties();<br />
Enumeration en = p.elements();<br />
while(en.hasMoreElements()){<br />
&nbsp;Object o = en.nextElement();<br />
&nbsp;System.out.println(o.toString());<br />
}<br />
---------------------------<br />
打印出来的是<br />
---------------------------<br />
Java(TM) 2 Runtime Environment, Standard Edition<br />
C:\jdk1.5\jre\bin<br />
1.5.0_07-b03<br />
Sun Microsystems Inc.<br />
http://java.sun.com/<br />
;<br />
Java HotSpot(TM) Client VM<br />
sun.io<br />
JP<br />
Service Pack 2<br />
Java Virtual Machine Specification<br />
C:\eclipse\workspace\demo<br />
1.5.0_07-b03<br />
sun.awt.Win32GraphicsEnvironment<br />
C:\jdk1.5\jre\lib\endorsed<br />
x86<br />
C:\DOCUME~1\jiangyu\LOCALS~1\Temp\</p>
<p>Sun Microsystems Inc.<br />
Windows XP<br />
MS932<br />
C:\jdk1.5\bin;.;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\ThinkPad\Utilities;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\jdk1.5\bin;C:\maven-2.0.4\bin;%PYTHON_HOME%;C:\Program Files\Subversion\bin;C:\Python23<br />
Java Platform API Specification<br />
49.0<br />
HotSpot Client Compiler<br />
5.1<br />
C:\Documents and Settings\jiangyu<br />
sun.awt.windows.WPrinterJob<br />
MS932<br />
1.5<br />
C:\eclipse\workspace\demo\build\classes;C:\tomcat5\common\lib\commons-el.jar;C:\tomcat5\common\lib\jasper-compiler-jdt.jar;C:\tomcat5\common\lib\jasper-compiler.jar;C:\tomcat5\common\lib\jasper-runtime.jar;C:\tomcat5\common\lib\jsp-api.jar;C:\tomcat5\common\lib\naming-factory-dbcp.jar;C:\tomcat5\common\lib\naming-factory.jar;C:\tomcat5\common\lib\naming-resources.jar;C:\tomcat5\common\lib\servlet-api.jar;C:\eclipse\plugins\org.junit_3.8.1\junit.jar;C:\springdependlib\commons-lang.jar;C:\springdependlib\commons-collections.jar;/c:/eclipse/plugins/org.eclipse.jdt.junit_3.1.1/junitsupport.jar;/c:/eclipse/plugins/org.eclipse.jdt.junit.runtime_3.1.0/junitruntime.jar<br />
jiangyu<br />
1.0<br />
C:\jdk1.5\jre<br />
32<br />
ja<br />
Sun Microsystems Inc.<br />
sun.awt.windows.WToolkit<br />
mixed mode, sharing<br />
1.5.0_07<br />
C:\jdk1.5\jre\lib\ext<br />
C:\jdk1.5\jre\lib\rt.jar;C:\jdk1.5\jre\lib\i18n.jar;C:\jdk1.5\jre\lib\sunrsasign.jar;C:\jdk1.5\jre\lib\jsse.jar;C:\jdk1.5\jre\lib\jce.jar;C:\jdk1.5\jre\lib\charsets.jar;C:\jdk1.5\jre\classes<br />
Sun Microsystems Inc.<br />
\<br />
http://java.sun.com/cgi-bin/bugreport.cgi<br />
UnicodeLittle<br />
little<br />
windows<br />
pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86<br />
--------------------------------------<br />
现在知道为什么一些JAVA的程序在安装的时候能自动找到你的JDK了吧:)<br />
通过java.lang.System类,我们在运行程序的时候,就可以得到JAVA的一些环境信息了(如JDK版本,JDK安装路径,CLASSPATH,PATH等).<br />
简单吗?<br />
</p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/184628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2008-03-08 09:14 <a href="http://www.blogjava.net/liuwentao253/archive/2008/03/08/184628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 如何初始化一个容器</title><link>http://www.blogjava.net/liuwentao253/archive/2007/09/01/141867.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sat, 01 Sep 2007 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/09/01/141867.html</guid><description><![CDATA[什么是Spring 的 IOC 容器呢 ?&nbsp; 可以说&nbsp; BeanFactory 就是 我们看到的Spring IoC容器.<br />
<br />
如何初始化 SPRING 的 IOC 容器 ? <br />
<br />
一共三种方法 ：<br />
<br />
1 ：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Resource&nbsp;resource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileSystemResource(</span><span style="color: #000000">"</span><span style="color: #000000">beans.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong style="color: #000080">BeanFactory</strong>&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;<u>XmlBeanFactory</u>(resource);</span></div>
<p><br />
2：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">ClassPathResource&nbsp;resource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathResource(</span><span style="color: #000000">"</span><span style="color: #000000">beans.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong style="color: #003366">BeanFactory</strong>&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;<u>XmlBeanFactory</u>(resource);</span></div>
<p>&nbsp;<br />
3：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_78_135_Open_Image" onclick="this.style.display='none'; Codehighlighter1_78_135_Open_Text.style.display='none'; Codehighlighter1_78_135_Closed_Image.style.display='inline'; Codehighlighter1_78_135_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_78_135_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_78_135_Closed_Text.style.display='none'; Codehighlighter1_78_135_Open_Image.style.display='inline'; Codehighlighter1_78_135_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">ApplicationContext&nbsp;context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;<u>ClassPathXmlApplicationContext</u>(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[]&nbsp;</span><span id="Codehighlighter1_78_135_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_78_135_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext-part2.xml</span><span style="color: #000000">"</span><span style="color: #000000">}</span></span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong style="color: #003366">BeanFactory</strong>&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(BeanFactory)&nbsp;context;</span></div>
<p><br />
详细展开 ：<br />
<br />
一 ：org.springframework.core.io包中主要是各样的Resource类<br />
<br />
<img height="768" alt="" src="http://www.blogjava.net/images/blogjava_net/liuwentao253/5.jpg" width="672" border="0" /><br />
<br />
补充UML 知识 ：<br />
<br />
1：类名是斜体的表示是抽象类，正体的表示普通类<br />
<br />
2 ：<br />
<img height="153" alt="" src="http://www.blogjava.net/images/blogjava_net/liuwentao253/SNAG-0005.jpg" width="683" border="0" /><br />
3 ：<br />
<br />
&nbsp;&nbsp;&nbsp; <img height="291" alt="" src="http://www.blogjava.net/images/blogjava_net/liuwentao253/SNAG-0006.jpg" width="536" border="0" /><br />
<br />
</p>
<a title="温昱说图" href="http://gocom.primeton.com/blog/index.php?op=ViewArticle&amp;articleId=93&amp;blogId=23">温昱说图</a><br />
<br />
org.springframework.core.io包中主要是各样的Resource类，Spring的 <code class="interfacename">Resource</code> 接口是为了提供更强的访问底层资源能力的抽象。相当巧妙的地方在于，为何AbstractResource的子类有的override了getFile()而有的没有？这是因为在AbstractResource的getFile()方法设计为抛出异常，如果子类没有重写此方法，说明子类不支持通过绝对路径查找资源的方式，而override的子类则提供自己的实现。这里通过类的层次设计，充分利用继承带来的优点，避免了大量的条件语句。<br />
<br />
<br />
二&nbsp;：关于 org.springframework.beans.factory 包 和 org.springframework.context 包：<br />
<br />
1 ：BeanFactory 是个接口，LifecycleBean 是个类它负责管理bean的生命周期，它实现了4个接口，并且有一个 BeanFactory&nbsp; 类型的变量 owningFactory<br />
<br />
<img height="612" alt="" src="http://www.blogjava.net/images/blogjava_net/liuwentao253/6.jpg" width="660" border="0" /><br />
<br />
补充一下 上文 的 XmlBeanFactory 不是 <br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">org.springframework.beans.factory</span></div>
<br />
包下面的 而是 <br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">org.springframework.beans.factory.xml</span></div>
<br />
下面的<br />
<br />
2 。 ApplicationContext 也是个接口，它继承的 ListableBeanFactory&nbsp; 接口 又 继承 BeanFactory 接口<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_158_160_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_160_Open_Text.style.display='none'; Codehighlighter1_158_160_Closed_Image.style.display='inline'; Codehighlighter1_158_160_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_158_160_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_158_160_Closed_Text.style.display='none'; Codehighlighter1_158_160_Open_Image.style.display='inline'; Codehighlighter1_158_160_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;<strong>ApplicationContext&nbsp;</strong></span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;<u>ListableBeanFactory</u>,&nbsp;HierarchicalBeanFactory,&nbsp;&nbsp;MessageSource,&nbsp;ApplicationEventPublisher,&nbsp;ResourcePatternResolver&nbsp;</span><span id="Codehighlighter1_158_160_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_158_160_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_57_59_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_59_Open_Text.style.display='none'; Codehighlighter1_57_59_Closed_Image.style.display='inline'; Codehighlighter1_57_59_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_57_59_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_57_59_Closed_Text.style.display='none'; Codehighlighter1_57_59_Open_Image.style.display='inline'; Codehighlighter1_57_59_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;<u>ListableBeanFactory</u>&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;<strong>BeanFactory</strong>&nbsp;</span><span id="Codehighlighter1_57_59_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_57_59_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring的bean包支持通过编码方式管理和操作bean的基本功能，ApplicationContext则以Framework的方式提供BeanFactory的所有功能。使用<br />
ApplicationContext，你可以让系统加载你的bean，例如：<br />
<br />
在Servlet容器初始化ContextLoaderServlet时，通过ContextLoader类加载Spring Framework），而不是使用编码方式来加载。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext接口是context包的基础，位于org.springframework.context包里，提供了BeanFactory的所有功能。除此之外， ApplicationContext为了支持Framework的工作方式，提供了以下的功能：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l.MessageSource，提供了语言信息的国际化支持<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">.提供资源（如URL和文件系统）的访问支持<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">.为实现了ApplicationListener接口的bean提供了事件传播支持<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">.为不同的应用环境提供不同的context，例如支持web应用的XmlWebApplicationContext类</span></div>
<br />
<br />
 <img src ="http://www.blogjava.net/liuwentao253/aggbug/141867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-09-01 09:35 <a href="http://www.blogjava.net/liuwentao253/archive/2007/09/01/141867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>