<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>darchen</title>
    <description></description>
    <link>http://darchen.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>ApplicationContext 是Spring的核心</title>
        <author>darchen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://darchen.javaeye.com">darchen</a>&nbsp;
          链接：<a href="http://darchen.javaeye.com/blog/98129" style="color:red;">http://darchen.javaeye.com/blog/98129</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ApplicationContext 是Spring的核心，Context我们通常解释为上下文环境，我想用&ldquo;容器&rdquo;来表述它更容易理解一些，ApplicationContext则是&ldquo;应 用的容器&rdquo;了:P，Spring把Bean放在这个容器中，在需要的时候，用getBean方法取出，虽然我没有看过这一部分的源代码，但我想它应该是一 个类似Map的结构。&nbsp;<br />
在Web应用中，我们会用到WebApplicationContext，WebApplicationContext继 承自ApplicationContext，先让我们看看在Web应用中，怎么初始化WebApplicationContext，在web.xml中定 义:&nbsp;<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">context-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>contextConfigLocation</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>/WEB-INF/applicationContext.xml</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">context-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">listener</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span><span>org.springframework.web.context.ContextLoaderListener</span><span class="tag">&lt;/</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">listener</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>context</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>org.springframework.web.context.ContextLoaderServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
可 以看出，有两种方法，一个是用ContextLoaderListener这个Listerner，另一个是ContextLoaderServlet这 个Servlet，这两个方法都是在web应用启动的时候来初始化WebApplicationContext，我个人认为Listerner要比 Servlet更好一些，因为Listerner监听应用的启动和结束，而Servlet得启动要稍微延迟一些，如果在这时要做一些业务的操作，启动的前 后顺序是有影响的。&nbsp;<br />
<br />
那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢？&nbsp;<br />
以ContextLoaderListener为例，我们可以看到&nbsp;<br />
public&nbsp;void&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;{&nbsp;<br />
this.contextLoader&nbsp;=&nbsp;createContextLoader();&nbsp;<br />
this.contextLoader.initWebApplicationContext(event.getServletContext());&nbsp;<br />
}&nbsp;<br />
protected&nbsp;ContextLoader&nbsp;createContextLoader()&nbsp;{&nbsp;<br />
return&nbsp;new&nbsp;ContextLoader();&nbsp;<br />
}&nbsp;<br />
ContextLoader 是一个工具类，用来初始化WebApplicationContext，其主要方法就是initWebApplicationContext，我们继续追 踪initWebApplicationContext这个方法（具体代码我不贴出，大家可以看Spring中的源码），我们发现，原来 ContextLoader是把WebApplicationContext（XmlWebApplicationContext是默认实现类）放在了 ServletContext中，ServletContext也是一个&ldquo;容器&rdquo;，也是一个类似Map的结构，而 WebApplicationContext在ServletContext中的KEY就是 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE，我们如果要使用 WebApplicationContext则需要从ServletContext取出，Spring提供了一个 WebApplicationContextUtils类，可以方便的取出WebApplicationContext，只要把 ServletContext传入就可以了。&nbsp;<br />
<br />
上面我们介绍了WebApplicationContext在Servlet容器中初始化 的原理，一般的Web应用就可以轻松的使用了，但是，随着Struts的广泛应用，把Struts和Spring整个起来，是一个需要面对的问题， Spring本身也提供了Struts的相关类，主要使用的有 org.springframework.web.struts.ActionSupport，我们只要把自己的Action继承自 ActionSupport，就是可以调用ActionSupport中getWebApplicationContext()的方法取出 WebApplicationContext，但这样一来在Action中，需要取得业务逻辑的地方都要getBean，看上去不够简洁，所以 Spring又提供了另一个方法，用org.springframework.web.struts.ContextLoaderPlugIn，这是一个 Struts的Plug，在Struts启动时加载，对于Action，可以像管理Bean一样来管理，在struts-config.xml中 Action的配置变成类似下面的样子&nbsp;<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">attribute</span><span>=</span><span class="attribute-value">&quot;aForm&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;aForm&quot;</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;/aAction&quot;</span><span>&nbsp;</span><span class="attribute">scope</span><span>=</span><span class="attribute-value">&quot;request&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;org.springframework.web.struts.DelegatingActionProxy&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">forward</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;forward&quot;</span><span>&nbsp;</span><span class="attribute">path</span><span>=</span><span class="attribute-value">&quot;forward.jsp&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
注 意type变成了org.springframework.web.struts.DelegatingActionProxy，之后我们需要建立 action-servlet.xml这样的文件，action-servlet.xml符合Spring的spring-beans.dtd标准，在里 面定义类似下面的&nbsp;<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;/aAction&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.web.action.Aaction&quot;</span><span>&nbsp;</span><span class="attribute">singleton</span><span>=</span><span class="attribute-value">&quot;false&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;businessService&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;businessService&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
com.web.action.Aaction 是Action的实现类，businessService是需要的业务逻辑，Spring会把businessService注入到Action中，在 Action中只要写businessService的get和set方法就可以了，还有一点，action的bean是singleton= &quot;false&quot;，即每次新建一个实例，这也解决了Struts中Action的线程同步问题，具体过程是当用户做&ldquo;/aAction&rdquo;的HTTP请求（当 然应该是&ldquo;/aAction.do&rdquo;），Struts会找到这个Action的对应类 org.springframework.web.struts.DelegatingActionProxy， DelegatingActionProxy是个代理类，它会去找action-servlet.xml文件中&ldquo;/aAction&rdquo;对应的真正实现类，然 后把它实例化，同时把需要的业务对象注入，然后执行Action的execute方法。&nbsp;<br />
<br />
使用了ContextLoaderPlugIn，在struts-config.xml中变成类似这样配置&nbsp;<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">plug-in</span><span>&nbsp;</span><span class="attribute">className</span><span>=</span><span class="attribute-value">&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">set-property</span><span>&nbsp;</span><span class="attribute">property</span><span>=</span><span class="attribute-value">&quot;contextConfigLocation&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">plug-in</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
而在web.xml中不再需要ContextLoaderListener或是ContextLoaderServlet。&nbsp;<br />
<br />
说 到这里不知道大家会不会有这样的问题，如果使用ContextLoaderPlugIn，如果我们有些程序是脱离Struts的Action环境，我们怎 么处理，比如我们要自定义标记库，在标记库中，我们需要调用Spring管理的业务层逻辑对象，这时候我们就很麻烦，因为只有在action中动态注入业 务逻辑，其他我们似乎不能取得Spring的WebApplicationContext。&nbsp;<br />
<br />
别急，我们还是来看一下 ContextLoaderPlugIn的源码（源码不再贴出），我们可以发现，原来ContextLoaderPlugIn仍然是把 WebApplicationContext放在ServletContext中，只是这个KEY不太一样了，这个KEY值为 ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()（具体请查 看源代码），这下好了，我们知道了WebApplicationContext放在哪里，只要我们在Web应用中能够取到ServletContext也 就能取到WebApplicationContext了:)&nbsp;<br />
<br />
Spring是一个很强大的框架，希望大家在使用过程中不断的深入，了解其更多的特性，我在这里抛砖引玉，有什么不对的地方，请大家指出
          <br/>
          <span style="color:red;">
            <a href="http://darchen.javaeye.com/blog/98129#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jul 2007 14:35:11 +0800</pubDate>
        <link>http://darchen.javaeye.com/blog/98129</link>
        <guid>http://darchen.javaeye.com/blog/98129</guid>
      </item>
      <item>
        <title>近一段时间没有来这里了</title>
        <author>darchen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://darchen.javaeye.com">darchen</a>&nbsp;
          链接：<a href="http://darchen.javaeye.com/blog/82563" style="color:red;">http://darchen.javaeye.com/blog/82563</a>&nbsp;
          发表时间: 2007年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近一段时间，也不知是因为什么原因，尽有一个月的时间，没有来这里了。<br />
<br />
可能有很多的原因，但主要原因只有一个，那就是一个懒字。<br />
<br />
有空来坐坐，这是哪一首歌里的呢？
          <br/>
          <span style="color:red;">
            <a href="http://darchen.javaeye.com/blog/82563#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 May 2007 12:42:24 +0800</pubDate>
        <link>http://darchen.javaeye.com/blog/82563</link>
        <guid>http://darchen.javaeye.com/blog/82563</guid>
      </item>
      <item>
        <title>吃饭饭了撑的.</title>
        <author>darchen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://darchen.javaeye.com">darchen</a>&nbsp;
          链接：<a href="http://darchen.javaeye.com/blog/70615" style="color:red;">http://darchen.javaeye.com/blog/70615</a>&nbsp;
          发表时间: 2007年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="4"><font face="Courier New">现在总是听到这样一句话:吃饱了撑的。<br />
今天我也是吃饱了撑的，就写一段文字，记录下最近一段时间的心情。<br />
<br />
&nbsp;&nbsp;&nbsp; 最近啊，想着接触IT这一行当，也有几年了，其实也就是照着猫画虎而己，所谓的高科技也就是这样，糊悠一下不懂的人。当然了，我只是说，自己所写的一些东西，万万不可惊动了大师们。总之，近一段时间，就是一个字&ldquo;乱&rdquo;。<br />
&nbsp;&nbsp;&nbsp; 在实际的工作中，越来越觉得基础是很重要的，所以，就想通过参加软考，系统地学习一下计算机知识，一方面，也是对自己的一个提高，另外一方面，也是为了生活的一个招牌，最其码，手里还有一个证什么的，总比什么都没有强。特别是在找工作的时候。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 学习的课程是《数据结构》，前些天学习了，《计算机理论基础》那里面一些数字逻辑电路方面的东西，弄的我太二各尚一头的雾水。相比较来说，数据结构，就好多了，觉得在实际中，可以帮我解决一些问题，特别处理同样的一些问题，不同的算法，其效率大不一样。</font></font>
          <br/>
          <span style="color:red;">
            <a href="http://darchen.javaeye.com/blog/70615#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Apr 2007 12:45:02 +0800</pubDate>
        <link>http://darchen.javaeye.com/blog/70615</link>
        <guid>http://darchen.javaeye.com/blog/70615</guid>
      </item>
      <item>
        <title>迷茫的学习期</title>
        <author>darchen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://darchen.javaeye.com">darchen</a>&nbsp;
          链接：<a href="http://darchen.javaeye.com/blog/67557" style="color:red;">http://darchen.javaeye.com/blog/67557</a>&nbsp;
          发表时间: 2007年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="4">博客：<br />
&nbsp;&nbsp;&nbsp; 以前没有写博客的习惯，但最近，看到网友说，学习写博客，有利于总结学习。<br />
&nbsp;&nbsp;&nbsp; 虽然我的年龄在IT这一行当应该是老了，但因为我是一半路出家，所以，还以新手，也就是人老心不老。人吗，长了一个脑袋，不用也不会多活多少岁，这就是半路出家，搞IT的理由。当然，还有一更实际的理由，那就是为了一日三餐。<br />
<br />
&nbsp;&nbsp;&nbsp; 回想以前一直是在弄asp,C#，自从去年开始接触java，还是比较喜欢的，虽然，到现在还是丈二和尚，便总会有云开雾散的一天，这几年一直是这样过来的。即使是弄ASP，C#也不例外，学习总有这样一个过程。<br />
<br />
&nbsp;&nbsp;&nbsp; 近一段时间，了解了STRUTS，HIBERNATE，SPRING，JDON，EASYJF ，SPRINGSIDE，看了一下EASYJF的源码，越来越迷糊了，在JAVA的领域里，真是百家争艳，好的技术真多啊。而且，在欣赏着大师的代码时，总是这样想：原来自己以前弄的一些所谓的高科技的IT程序，只不过是垃圾一堆。这样一想，好象这条路不属于我这样天姿就一个笨蛋所要走的路。而且，已很快到了退休的年龄了。<br />
&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 于是，从昨天晚上夜里开始，合上了书，想啊想啊，还是没有想出一个所以然来。什么时候 ：&ldquo;众里寻他千而度，蓦然回首，那人却在灯火阑珊处。&rdquo;</font>
          <br/>
          <span style="color:red;">
            <a href="http://darchen.javaeye.com/blog/67557#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Apr 2007 10:34:48 +0800</pubDate>
        <link>http://darchen.javaeye.com/blog/67557</link>
        <guid>http://darchen.javaeye.com/blog/67557</guid>
      </item>
  </channel>
</rss>