﻿<?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-agun 阿甘 ---分享,共同进步-随笔分类-架构设计与系统分析</title><link>http://www.blogjava.net/agun/category/31497.html</link><description>激情成就梦想，努力创造未来</description><language>zh-cn</language><lastBuildDate>Sat, 04 Dec 2010 21:37:07 GMT</lastBuildDate><pubDate>Sat, 04 Dec 2010 21:37:07 GMT</pubDate><ttl>60</ttl><item><title>spring 常识2</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339788.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339788.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339788.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339788.html</trackback:ping><description><![CDATA[<p><span style="color: #ff0000">1， Spring bean 定义</span></p>
<p>spring bean 定义可能包含大量的配置信息，包括容器相关的信息（比如初始化方法，静态工厂方法</p>
<p>等）、构造函数参数、属性等。如果两个bean之间的配置信息大同小异，可采用bean的继承来减少重</p>
<p>复配置工作。子bean定义可以从父bean定义继承部分配置。它也可覆盖一些配置，或者添加一些配置</p>
<p>。使用继承配置可以节省很多输入工作，实际上就是一种模板形式。</p>
<p><span style="color: #ff0000">spring中事务配置中就有这样例子，为了使用事务只要父配置了事务代理就可以了，所有需要事务的</span></p>
<p><span style="color: #ff0000">bean只要继承父就可以了。说到这个就在多说几句，父bean通常不需要实例化的，而仅仅作为子bean</span></p>
<p><span style="color: #ff0000">定的的模板使用；而ApplicationContext默认预初始化所有的singleton bean。为了阻止父bean被预</span></p>
<p><span style="color: #ff0000">初始化，可以使用abstract属性设置父bean为抽象bean。容器会忽略所有的抽象bean定义，预初始化</span></p>
<p><span style="color: #ff0000">时不初始化抽象bean</span>。</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">2， spring 事务管理</span></p>
<p>传统的J2EE开发者对事务管理可能采用两种策略</p>
<p><span style="color: #ff0000">（1），全局事务</span>：全局事务通常由应用服务器管理，使用JTA。全局事务可跨越多个事务性的资源，保证</p>
<p>在多个事务性资源间跨越时资源一致性。<br />
<span style="color: #ff0000">（2），局部事务</span>：局部事务和特定资源相关，如，一个和JDBC链接关联的事务。该事务尽能保证对该</p>
<p>JDBC连接数据库的一致性，对局部事务，应用服务器不需要参与事务管理，不能保证跨越多个资源的</p>
<p>事务正确性。</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">3，编程式事务</span></p>
<p>Spring 提供两种编程式的事务管理</p>
<p>&nbsp;</p>
<p>（1）使用TransactionTemplate事务管理</p>
<p>（2）直接使用一个PlatformTransactionManager实现类管理事务。</p>
<p>&nbsp;</p>
<p>两种编程式的事务都不需要与特定的事务API耦合，第一种更符合Spring模板式的编程模型，因此通常推荐采用第一种方式，第二种非常类似于JTA的UserTransaction的API编程，区别是减少了异常处理。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">4，声明式事务</span></p>
<p>Spring的声明式事务是通过面向切面（AOP）实现。</p>
<p>（1）使用声明式事务管理</p>
<p>通常，通过TransactionPoxyFactoryBean为目标Bean生成Spring事务代理。当bean实例的方法需要事务管理时，采用TransactionPoxyFactoryBean来自目标bean生成事务代理。<span style="color: #ff0000">每个TransactionPoxyFactoryBean为一个具体的目标bean生成代理对象，代理对象的方法改写了目标bean的方法，就是在目标bean的方法执行之前加入开始事务，在目标bean方法结束之后提交事务，遇到指定异常回滚事务</span>。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 定义事务代理bean模板</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.javaeye.com/blog/789046#"><img alt="复制代码" src="http://agun.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"txProxyTemplate"</span><span>&nbsp;</span><span class="attribute">abstract</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>="</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span><span>&nbsp;style="</span><span class="attribute-value">COLOR</span><span>:&nbsp;#ff0000"</span><span class="tag">&gt;</span><span>org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span><span class="tag">&lt;/</span><span class="tag-name">SPAN</span><span class="tag">&gt;</span><span>"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</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">"transactionManager"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">"transactionManager"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</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">"transactionAttributes"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"trans_*"</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"query*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,readOnly,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"find*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,readOnly,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"load*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,readOnly,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"*"</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED,-Exception</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">	&lt;bean id="txProxyTemplate" abstract="true"
class="<span style="color: #ff0000">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span>"&gt;
&lt;property name="transactionManager"&gt;
&lt;ref bean="transactionManager" /&gt;
&lt;/property&gt;
&lt;property name="transactionAttributes"&gt;
&lt;props&gt;
&lt;prop key="trans_*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
&lt;prop key="query*"&gt;
PROPAGATION_REQUIRED,readOnly,-Exception
&lt;/prop&gt;
&lt;prop key="find*"&gt;
PROPAGATION_REQUIRED,readOnly,-Exception
&lt;/prop&gt;
&lt;prop key="load*"&gt;
PROPAGATION_REQUIRED,readOnly,-Exception
&lt;/prop&gt;
&lt;prop key="*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;
&lt;/props&gt;
&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>（2）根据BeanName自动创建事务代理</p>
<p>如果同一个应用中有很多目标bean需要生成事务代理，当然可以为每个目标bean额外配置一个TransactionPoxyFactoryBean bean.这样做的缺点是，配置文件相当臃肿而且难以维护，此时可以考虑使用自动事务代理。自动事务代理的思路是，当ApplicationContext初始化完成后，由上下文中的某个bean<span style="color: #ff0000">"后处理"</span>每个目标bean，为这些目标bean生成事务代理。</p>
<p>能为目标bean执行<span style="color: #ff0000">"后处理"</span>的bean必须实现<span style="color: #ff0000">BeanFactoryPostProcessor</span>接口，ApplicationContext完成初始化后，会自动初始化所有实现BeanFactoryPostProcessor接口的bean，并且让它<span style="color: #ff0000">&#8220;后处理&#8221;</span>其他bean.Spring提供BeanFactoryPostProcessor的实现类<span style="color: #ff0000">BeanNameAutoPoxyCreator</span>，<span style="color: #ff0000">BeanNameAutoPoxyCreator</span>可以用来处理ApplicationContext中其他bean，方法是通过名称来识别，并且把他们用事务代理包装起来。<span style="color: #ff0000">BeanNameAutoPoxyCreator</span>生成的事务代理，和使用TransactionPoxyFactoryBean生成的事务代理基本一致。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 定义事务拦截bean</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.javaeye.com/blog/789046#"><img alt="复制代码" src="http://agun.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"transactionInterceptor"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="attribute">class</span><span>="</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span><span>&nbsp;style="</span><span class="attribute-value">COLOR</span><span>:&nbsp;#ff0000"</span><span class="tag">&gt;</span><span>org.springframework.transaction.interceptor.TransactionInterceptor</span><span class="tag">&lt;/</span><span class="tag-name">SPAN</span><span class="tag">&gt;</span><span>"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</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">"transactionManager"</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">"TransactionManager"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</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">"transactionAttributes"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"create*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"delete*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"update*"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">"get*"</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">&nbsp;&lt;bean id="transactionInterceptor"
&nbsp;&nbsp;class="<span style="color: #ff0000">org.springframework.transaction.interceptor.TransactionInterceptor</span>"&gt;
&nbsp;&nbsp;&lt;property name="transactionManager" ref="TransactionManager" /&gt;
&nbsp;&nbsp;
&nbsp;&nbsp;&lt;property name="transactionAttributes"&gt;
&nbsp;&nbsp;&nbsp;&lt;props&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="create*"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="delete*"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="update*"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROPAGATION_REQUIRED,-Exception
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="get*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
&nbsp;&nbsp;&nbsp;&lt;/props&gt;
&nbsp;&nbsp;&lt;/property&gt;
&nbsp;&lt;/bean&gt;</pre>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://agun.javaeye.com/blog/789046#"><img alt="复制代码" src="http://agun.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="attribute">class</span><span>="</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span><span>&nbsp;style="</span><span class="attribute-value">COLOR</span><span>:&nbsp;#ff0000"</span><span class="tag">&gt;</span><span>org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</span><span class="tag">&lt;/</span><span class="tag-name">SPAN</span><span class="tag">&gt;</span><span>"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</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">"beanNames"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>*Service</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</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">"interceptorNames"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>transactionInterceptor</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</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>
<pre class="xml" style="display: none" name="code">&nbsp;&lt;bean
&nbsp;&nbsp;class="<span style="color: #ff0000">org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</span>"&gt;
&nbsp;&nbsp;&lt;property name="beanNames"&gt;
&nbsp;&nbsp;&nbsp;&lt;value&gt;*Service&lt;/value&gt;
&nbsp;&nbsp;&lt;/property&gt;
&nbsp;&nbsp;&lt;property name="interceptorNames"&gt;
&nbsp;&nbsp;&nbsp;&lt;list&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;transactionInterceptor&lt;/value&gt;
&nbsp;&nbsp;&nbsp;&lt;/list&gt;
&nbsp;&nbsp;&lt;/property&gt;
&nbsp;&lt;/bean&gt;&nbsp;</pre>
<p>&nbsp;</p>
<p>次配置关键在两个bean </p>
<p>TransactionInterceptor</p>
<p>BeanNameAutoProxyCreator</p>
<p>&nbsp;</p>
<p>（3）基于注释式事务代理配置</p>
<img src ="http://www.blogjava.net/agun/aggbug/339788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:52 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 常识1</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339787.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339787.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339787.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339787.html</trackback:ping><description><![CDATA[<span style="color: #ff0000">1,实例化bean</span><br />
就Spring IoC容器而言，bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候，容器会从bean定义列表中取得一个指定的bean定义，并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。因此这一节将讲解如何告知Spring IoC容器我们将要实例化的对象的类型以及如何实例化对象。
<p>当采用XML描述配置元数据时，将通过&lt;bean/&gt;元素的class属性来指定实例化对象的类型。class 属性 (对应BeanDefinition实例的Class属性)通常是必须的(不过也有两种例外的情形，&#8220;使用实例工厂方法实例化&#8221;和&#8220;bean定义的继承&#8221;)。class属性主要有两种用途：在大多数情况下，容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符)；在极少数情况下，容器将调用类的静态工厂方法来创建bean实例，class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。</p>
<p><span style="color: #ff0000">2, 延迟初始化bean</span><br />
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分，ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事，因为这样在配置中的任何错误就会即刻被发现（否则的话可能要花几个小时甚至几天）。</p>
<p>有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化，那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。</p>
<p>在XML配置文件中，延迟初始化将通过&lt;bean/&gt;元素中的lazy-init属性来进行控制。例如：</p>
<p>&lt;bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- various properties here... --&gt;<br />
&lt;/bean&gt;<br />
&nbsp; &lt;bean name="not.lazy" class="com.foo.AnotherBean"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- various properties here... --&gt;<br />
&lt;/bean&gt;<br />
当ApplicationContext实现加载上述配置时，设置为lazy的bean将不会在ApplicationContext启动时提前被实例化，而not.lazy却会被提前实例化。</p>
<p>需要说明的是，如果一个bean被设置为延迟初始化，而另一个非延迟初始化的singleton bean依赖于它，那么当ApplicationContext提前实例化singleton bean时，它必须也确保所有上述singleton 依赖bean也被预先初始化，当然也包括设置为延迟实例化的bean。因此，如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例，你也不要觉得奇怪，因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。</p>
<p>在容器层次中通过在&lt;beans/&gt;元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置：<br />
&lt;beans default-lazy-init="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- no beans will be eagerly pre-instantiated... --&gt;<br />
&lt;/beans&gt;</p>
<p><br />
<span style="color: #ff0000">3,自动装配（autowire）协作者</span><br />
Spring IoC容器可以自动装配（autowire）相互协作bean之间的关联关系。因此，如果可能的话，可以自动让Spring通过检查BeanFactory中的内容，来替我们指定bean的协作者（其他被依赖的bean）。由于autowire可以针对单个bean进行设置，因此可以让有些bean使用autowire，有些bean不采用。autowire的方便之处在减少或者消除属性或构造器参数的设置，这样可以给我们的配置文件减减肥！[2] 在xml配置文件中，autowire一共有五种类型，可以在&lt;bean/&gt;元素中使用autowire属性指定:</p>
<p>Table 3.2. Autowiring modes</p>
<p>模式 说明 </p>
<p>&nbsp;&nbsp;&nbsp; no 不使用自动装配。必须通过ref元素指定依赖，这是默认设置。由于显式指定协作者可以使配置更灵活、更清晰，因此对于较大的部署配置，推荐采用该设置。而且在某种程度上，它也是系统架构的一种文档形式。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean，并将其与属性自动装配。例如，在bean定义中将autowire设置为by name，而该bean包含master属性（同时提供setMaster(..)方法），Spring就会查找名为master的bean定义，并用它来装配给master属性。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; byType 如果容器中存在一个与指定属性类型相同的bean，那么将与该属性自动装配。如果存在多个该类型的bean，那么将会抛出异常，并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean，则什么事都不发生，属性也不会被设置。如果你不希望这样，那么可以通过设置dependency-check="objects"让Spring抛出异常。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; constructor 与byType的方式类似，不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean，那么将会抛出异常。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; autodetect 通过bean类的自省机制（introspection）来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器，那么将使用byType方式。<br />
&nbsp;</p>
<p>如果直接使用property和constructor-arg注入依赖的话，那么将总是覆盖自动装配。而且目前也不支持简单类型的自动装配，这里所说的简单类型包括基本类型、String、Class以及简单类型的数组（这一点已经被设计，将考虑作为一个功能提供）。自动装配还可以与依赖检查结合使用，这样依赖检查将在自动装配完成之后被执行。</p>
<p>理解自动装配的优缺点是很重要的。其中优点包括：</p>
<p>自动装配能显著减少配置的数量。不过，采用bean模板（见这里）也可以达到同样的目的。</p>
<p>自动装配可以使配置与java代码同步更新。例如，如果你需要给一个java类增加一个依赖，那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配，而在系统趋于稳定的时候改为显式装配的方式。</p>
<p>自动装配的一些缺点：</p>
<p>尽管自动装配比显式装配更神奇，但是，正如上面所提到的，Spring会尽量避免在装配不明确的时候进行猜测，因为装配不明确可能出现难以预料的结果，而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。</p>
<p>对于那些根据Spring配置文件生成文档的工具来说，自动装配将会使这些工具没法生成依赖信息。</p>
<p>如果采用by type方式自动装配，那么容器中类型与自动装配bean的属性或者构造函数参数类型一致的bean只能有一个，如果配置可能存在多个这样的bean，那么就要考虑采用显式装配了。</p>
<p>尽管使用autowire没有对错之分，但是能在一个项目中保持一定程度的一致性是最好的做法。例如，通常情况下如果没有使用自动装配，那么仅自动装配一个或两个bean定义可能会引起开发者的混淆。</p>
<img src ="http://www.blogjava.net/agun/aggbug/339787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:50 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ehcache缓存配置</title><link>http://www.blogjava.net/agun/archive/2010/12/04/339785.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sat, 04 Dec 2010 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2010/12/04/339785.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/339785.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2010/12/04/339785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/339785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/339785.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 近期项目用到Ehcache，以前项目主要用到Oscache,并且缓存也是针对orm来处理，只要配置就好，不需要自定义缓存，不需管理缓存。下面描述一下，Spring+Ehcache来处理缓存。1，首先引入jar包就不说了环境也不说了，要引入ehcache.xml文件(ehcache配置文件)。Xml代码     &lt;ehcache&nbsp;xmlns:xsi="ht...&nbsp;&nbsp;<a href='http://www.blogjava.net/agun/archive/2010/12/04/339785.html'>阅读全文</a><img src ="http://www.blogjava.net/agun/aggbug/339785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2010-12-04 11:46 <a href="http://www.blogjava.net/agun/archive/2010/12/04/339785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 支持 postgis函数</title><link>http://www.blogjava.net/agun/archive/2008/07/15/215089.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 15 Jul 2008 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/15/215089.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/215089.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/15/215089.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/215089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/215089.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天上午一位朋友问到了，关于hibernate中是否支持postgis函数的问题，我就这个问题，随便聊几句。要想使用hibernate的空间数据操作，就要提到一个概念 java Topology Suite (字面上理解就是 空间拓扑的意思，简称JTS,注意：过需要声明一点，本文中的JTS与进行java事务处理的JTS、JTA没有联系).HIBERNATE中对空间数据作了支...&nbsp;&nbsp;<a href='http://www.blogjava.net/agun/archive/2008/07/15/215089.html'>阅读全文</a><img src ="http://www.blogjava.net/agun/aggbug/215089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-15 23:05 <a href="http://www.blogjava.net/agun/archive/2008/07/15/215089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中bean的作用域简介(转载) </title><link>http://www.blogjava.net/agun/archive/2008/06/06/206320.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Fri, 06 Jun 2008 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/06/06/206320.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/206320.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/06/06/206320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/206320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/206320.html</trackback:ping><description><![CDATA[<p>Spring上个版本的IoC容器支持两个不同的bean作用域（单例与原型）。<br />
Spring 2.0改进了这一点，不仅提供了一些依赖于Spring部署环境（比如说，在web环境中的request和session作用域bean）的额外的作用域,而且提供了所谓的'钩子'（'hooks'）（因为找不到更好的表达）使Spring用户可以创造自己的作用域。</p>
<p>应该注意的是，即使单例与原型作用域beans的基本（内在）实现发生了变化，上述变化对最终用户来说是透明的...现有的配置不需要改变或放弃。</p>
<br />
如何使用spring的作用域：
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
下面分别对spring 中的作用域分别介绍一下：<br />
</p>
<p><strong>1、singleton作用域</strong></p>
<p>当一个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。</p>
<p>配置实例：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>或者</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>2、prototype</strong></p>
<p>prototype作用域部署的bean，每一次请求（将其注入到另一个bean中，或者以程序的方式调用容器的getBean()方法）都会产生一个新的bean实例，相当于一个new的操作，对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责，容器在初始化、配置、装饰或者是装配完一个prototype实例后，将它交给客户端，随后就对该prototype实例不闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用bean的后置处理器，该处理器持有要被清除的bean的引用。）</p>
<p>配置实例：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>或者</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;<br />
<strong>3、request</strong> </p>
<p>request表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效，配置实例：</p>
<p>request、session、global session使用的时候，首先要在初始化web的web.xml中做如下配置：</p>
<p>如果你使用的是Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;web-app&gt;<br />
            ...<br />
            &lt;listener&gt;<br />
            &lt;listener-class&gt;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;<br />
            &lt;/listener&gt;<br />
            ...<br />
            &lt;/web-app&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;web-app&gt;<br />
            ..<br />
            &lt;filter&gt; <br />
            &lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt; <br />
            &lt;filter-class&gt;org.springframework.web.filter.RequestContextFilter&lt;/filter-class&gt;<br />
            &lt;/filter&gt; <br />
            &lt;filter-mapping&gt; <br />
            &lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt; <br />
            &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
            &lt;/filter-mapping&gt;<br />
            ...<br />
            &lt;/web-app&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>接着既可以配置bean的作用域了：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p><strong>4、session</strong></p>
<p>session作用域表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效，配置实例：</p>
<p>配置实例：</p>
<p>和request配置实例的前提一样，配置好web启动文件就可以如下配置：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>5、global session</strong></p>
<p>global session作用域类似于标准的HTTP Session作用域，不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念，它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean，那么，web会自动当成session类型来使用。</p>
<p>配置实例：</p>
<p>和request配置实例的前提一样，配置好web启动文件就可以如下配置：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>6、自定义bean装配作用域</strong></p>
<p>在spring 2.0中作用域是可以任意扩展的，你可以自定义作用域，甚至你也可以重新定义已有的作用域（但是你不能覆盖singleton和prototype），spring的作用域由接口org.springframework.beans.factory.config.Scope来定义，自定义自己的作用域只要实现该接口即可，下面给个实例：</p>
<p>我们建立一个线程的scope，该scope在表示一个线程中有效，代码如下：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>publicclass MyScope implements Scope ...{ <br />
            privatefinal ThreadLocal threadScope = new ThreadLocal() ...{<br />
            protected Object initialValue() ...{<br />
            returnnew HashMap(); <br />
            } <br />
            }; <br />
            public Object get(String name, ObjectFactory objectFactory) ...{ <br />
            Map scope = (Map) threadScope.get(); <br />
            Object object = scope.get(name); <br />
            if(object==null) ...{ <br />
            object = objectFactory.getObject(); <br />
            scope.put(name, object); <br />
            } <br />
            return object; <br />
            } <br />
            public Object remove(String name) ...{ <br />
            Map scope = (Map) threadScope.get(); <br />
            return scope.remove(name); <br />
            }<br />
            publicvoid registerDestructionCallback(String name, Runnable callback) ...{ <br />
            }<br />
            public String getConversationId() ...{<br />
            // TODO Auto-generated method stub<br />
            returnnull;<br />
            } <br />
            }</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
注：本文的原文来源于网络。</p>
<img src ="http://www.blogjava.net/agun/aggbug/206320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-06-06 14:30 <a href="http://www.blogjava.net/agun/archive/2008/06/06/206320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>