<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Humanity To Others</title>
    <description></description>
    <link>http://12true.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>Struts Spring整合笔记</title>
        <author>12True</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://12true.javaeye.com">12True</a>&nbsp;
          链接：<a href="http://12true.javaeye.com/blog/165828" style="color:red;">http://12true.javaeye.com/blog/165828</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          他们之间的整合主要有三种方法<br /><a href="http://www.ibm.com/developerworks/cn/java/j-sr2.html" target="_blank">http://www.ibm.com/developerworks/cn/java/j-sr2.html</a><br /><br /><br />最近公司一个项目，需要用到Spring IoC容器<br />以前看过一些关于Spring的资料，没真正做过应用。<br />今天做了一下小测试。<br />把整合过程中遇到的问题 记录下。<br /><br />问题一 --- 只加载了Struts的插件，只把ActionServlet委托给Spring，没有把Action也委托给Spring代理<br /><pre name="code" class="java">
&lt;!--把ActionServlet委托给Spring-->
 &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    &lt;set-property property="contextConfigLocation" value="/WEB-INF/beans.xml" />
  &lt;/plug-in>

&lt;!--要把&lt;action-mapping>中的 type="",修改为type="org.springframework.web.struts.DelegatingActionProxy"
把Action委托Spring代理-->
</pre><br /><br />问题二 在装配Bean时，不细心，注入service时，却指向了dao的class<br /><pre name="code" class="java">
&lt;bean id="loginDAO" class="org.lostrue.dao.impl.LoginDAOimpl" scope="prototype"/>
	&lt;bean id="loginService" class="org.lostrue.service.impl.LoginServiceimpl" scope="prototype">
		&lt;property name="dao">
			&lt;ref bean="loginDAO"/>
		&lt;/property>
	&lt;/bean>
	&lt;bean name="/login" class="org.lostrue.struts.action.LoginAction" scope="prototype">
		&lt;property name="loginService">
			&lt;ref bean="loginService"/>
		&lt;/property>
	&lt;/bean>
</pre><br /><br />问题三 ---Action总是只被实例化一次，google以后才发现Spring2 还有个scope<br /><br />1、singleton作用域<br />当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例，并且所有对bean的请求，只要id与该bean定义相匹配，则只会返回bean的同一实例。换言之，当把一个bean定义设置为singleton作用域时，Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存（singleton cache）中，并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例，这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的，单例设计模式表示一个ClassLoader中只有一个class存在，而这里的singleton则表示一个容器对应一个bean，也就是说当一个bean被标识为singleton时候，spring的IOC容器中只会存在一个该bean。<br /><br />2、prototype<br /> prototype作用域部署的bean，每一次请求（将其注入到另一个bean中，或者以程序的方式调用容器的getBean()方法）都会产生一个新的bean实例，相当与一个new的操作，对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责，容器在初始化、配置、装饰或者是装配完一个prototype实例后，将它交给客户端，随后就对该prototype实例不闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用bean的后置处理器，该处理器持有要被清除的bean的引用。）<br /><br />3、request <br />request表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效，配置实例：<br />request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置：<br />如果你使用的是Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可：<br /> <pre name="code" class="java">&lt;web-app>
 ...
  &lt;listener>
&lt;listener-class>org.springframework.web.context.request.RequestContextListener&lt;/listener-class>
 &lt;/listener>
 ...
&lt;/web-app>
，如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现：
&lt;web-app>
 ..
 &lt;filter>
    &lt;filter-name>requestContextFilter&lt;/filter-name> 
    &lt;filter-class>org.springframework.web.filter.RequestContextFilter&lt;/filter-class>
 &lt;/filter> 
 &lt;filter-mapping>
    &lt;filter-name>requestContextFilter&lt;/filter-name> 
    &lt;url-pattern>/*&lt;/url-pattern>
 &lt;/filter-mapping>
  ...
&lt;/web-app>
</pre><br />接着既可以配置bean的作用域了<br /><br />4、session<br />session作用域表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效<br /><br />5、global session<br />global session作用域类似于标准的HTTP Session作用域，不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念，它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean，那么web会自动当成session类型来使用。<br /><br />6、自定义bean装配作用域<br />在spring2.0中作用域是可以任意扩展的，你可以自定义作用域，甚至你也可以重新定义已有的作用域（但是你不能覆盖singleton和prototype），spring的作用域由接口org.springframework.beans.factory.config.Scope来定义，自定义自己的作用域只要实现该接口即可，下面给个实例：<br />我们建立一个线程的scope，该scope在表示一个线程中有效，代码如下：<br /><pre name="code" class="java">publicclass MyScope implements Scope { 
     privatefinal ThreadLocal threadScope = new ThreadLocal() {
          protected Object initialValue() {
            returnnew HashMap(); 
          } 
    }; 
     public Object get(String name, ObjectFactory objectFactory) { 
        Map scope = (Map) threadScope.get(); 
        Object object = scope.get(name); 
        if(object==null) { 
          object = objectFactory.getObject(); 
          scope.put(name, object); 
        } 
        return object; 
     } 
     public Object remove(String name) { 
        Map scope = (Map) threadScope.get(); 
        return scope.remove(name); 
     }
     publicvoid registerDestructionCallback(String name, Runnable callback) { 
     }
    public String getConversationId() {
       // TODO Auto-generated method stub
       returnnull;
    } 
          }

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://12true.javaeye.com/blog/165828#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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 15:47:53 +0800</pubDate>
        <link>http://12true.javaeye.com/blog/165828</link>
        <guid>http://12true.javaeye.com/blog/165828</guid>
      </item>
      <item>
        <title>随机数</title>
        <author>12True</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://12true.javaeye.com">12True</a>&nbsp;
          链接：<a href="http://12true.javaeye.com/blog/160010" style="color:red;">http://12true.javaeye.com/blog/160010</a>&nbsp;
          发表时间: 2008年01月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          import java.util.Random; <br />/** <br />* Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法。 <br />* 它可以产生int、long、float、double以及Goussian等类型的随机数。 <br />* java.lang.Math中的方法random()只产生double型的随机数。 <br />*/ <br />public class RandomNumber{ <br /><br />public static void main(String[] args) { <br /><br />// 使用java.lang.Math的random方法生成随机数 <br />System.out.println("Math.random(): " + Math.random()); <br /><br />// 使用不带参数的构造方法构造java.util.Random对象 <br />System.out.println("使用不带参数的构造方法构造的Random对象:"); <br />Random rd1 = new Random(); <br />// 产生各种类型的随机数 <br />// 按均匀分布产生整数 <br />System.out.println("int: " + rd1.nextInt()); <br />// 按均匀分布产生长整数 <br />System.out.println("long: " + rd1.nextLong()); <br />// 按均匀分布产生大于等于0，小于1的float数[0, 1) <br />System.out.println("float: " + rd1.nextFloat()); <br />// 按均匀分布产生[0, 1)范围的double数 <br />System.out.println("double: " + rd1.nextDouble()); <br />// 按正态分布产生随机数 <br />System.out.println("Gaussian: " + rd1.nextGaussian()); <br /><br />// 生成一系列随机数 <br />System.out.print("随机整数序列:"); <br />for (int i = 0; i &lt; 5; i++) { <br />System.out.print(rd1.nextInt() + " "); <br />} <br />System.out.println(); <br /><br />// 指定随机数产生的范围 <br />System.out.print("[0,10)范围内随机整数序列: "); <br />for (int i = 0; i &lt; 10; i++) { <br />// Random的nextInt(int n)方法返回一个[0, n)范围内的随机数 <br />System.out.print(rd1.nextInt(10) + " "); <br />} <br />System.out.println(); <br />System.out.print("[5,23)范围内随机整数序列: "); <br />for (int i = 0; i &lt; 10; i++) { <br />// 因为nextInt(int n)方法的范围是从0开始的， <br />// 所以需要把区间[5,28)转换成5 + [0, 23)。 <br />System.out.print(5 + rd1.nextInt(23) + " "); <br />} <br />System.out.println(); <br />System.out.print("利用nextFloat()生成[0,99)范围内的随机整数序列: "); <br />for (int i = 0; i &lt; 10; i++) { <br />System.out.print((int) (rd1.nextFloat() * 100) + " "); <br />} <br />System.out.println(); <br />System.out.println(); <br /><br />// 使用带参数的构造方法构造Random对象 <br />// 构造函数的参数是long类型，是生成随机数的种子。 <br />System.out.println("使用带参数的构造方法构造的Random对象:"); <br />Random ran2 = new Random(10); <br />// 对于种子相同的Random对象，生成的随机数序列是一样的。 <br />System.out.println("使用种子为10的Random对象生成[0,10)内随机整数序列: "); <br />for (int i = 0; i &lt; 10; i++) { <br />System.out.print(ran2.nextInt(10) + " "); <br />} <br />System.out.println(); <br />Random ran3 = new Random(10); <br />System.out.println("使用另一个种子为10的Random对象生成[0,10)内随机整数序列: "); <br />for (int i = 0; i &lt; 10; i++) { <br />System.out.print(ran3.nextInt(10) + " "); <br />} <br />System.out.println(); <br />// ran2和ran3生成的随机数序列是一样的，如果使用两个没带参数构造函数生成的Random对象， <br />// 则不会出现这种情况，这是因为在没带参数构造函数生成的Random对象的种子缺省是当前系统时间的毫秒数。 <br /><br />// 另外，直接使用Random无法避免生成重复的数字，如果需要生成不重复的随机数序列，需要借助数组和集合类 <br />//本书第4章将给出解决方法。 <br />} <br />} <br /><br />运行结果： <br />C:\>java RandomNumber <br />Math.random(): 0.525171492959965 <br />使用不带参数的构造方法构造的Random对象: <br />int: 636539740 <br />long: -752663949229005813 <br />float: 0.87349784 <br />double: 0.4065973309853902 <br />Gaussian: 0.4505871918488808 <br />随机整数序列:1936784917 1339857386 -1185229615 1883411721 1409219372 <br />[0,10)范围内随机整数序列: 1 1 5 5 9 0 1 0 2 4 <br />[5,23)范围内随机整数序列: 9 13 26 18 11 27 26 12 21 8 <br />利用nextFloat()生成[0,99)范围内的随机整数序列: 1 47 72 59 49 86 80 88 55 82 <br /><br />使用带参数的构造方法构造的Random对象: <br />使用种子为10的Random对象生成[0,10)内随机整数序列: <br />3 0 3 0 6 6 7 8 1 4 <br />使用另一个种子为10的Random对象生成[0,10)内随机整数序列: <br />3 0 3 0 6 6 7 8 1 4
          <br/>
          <span style="color:red;">
            <a href="http://12true.javaeye.com/blog/160010#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Jan 2008 22:35:40 +0800</pubDate>
        <link>http://12true.javaeye.com/blog/160010</link>
        <guid>http://12true.javaeye.com/blog/160010</guid>
      </item>
  </channel>
</rss>