论坛首页 Java企业应用论坛

spring2.0 自定义Scope

浏览 6680 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-04  
    在spring 的以前版本中,只是支持singleton,prototype两种类型,
    在2.0中作了很大的改进,增加了RequestScope,和SessionScope两种范围。当然也支持自定义Scope
    下面简单介绍一下,spring2.0是如何支持自定义Scope的。
Scope接口,需要实现的接口,主要的方法:
  • Object get(String name, ObjectFactory objectFactory)
  • Object remove(String name)
  • void registerDestructionCallback(String name, Runnable callback)
get 和remove这是最常用的方法,registerDestructionCallback用于回收对象时,可以异步调用其它操作。
下面简单定义一个Scope对象:
 
java 代码
 
  1. Scope scope = new Scope() {  
  2.     private int index;  
  3.     private List objects = new LinkedList(); {  
  4.         objects.add(new TestBean());  
  5.         objects.add(new TestBean());  
  6.     }  
  7.     public String getConversationId() {  
  8.         return null;  
  9.     }  
  10.     public Object get(String name, ObjectFactory objectFactory) {  
  11.         if (index >= objects.size()) {  
  12.             index = 0;  
  13.         }  
  14.         return objects.get(index++);  
  15.     }  
  16.     public Object remove(String name) {  
  17.         throw new UnsupportedOperationException();  
  18.     }  
  19.     public void registerDestructionCallback(String name, Runnable callback) {  
  20.     }  
  21. };       



如何使用让此scope生效,有两种方法:
第一编程实现:
java 代码
 
  1. ConfigurableBeanFactory 定义了关于Scope的一些方法:  
  2. void registerScope(String scopeName, Scope scope);  
  3. String[] getRegisteredScopeNames();  
  4. Scope getRegisteredScope(String scopeName);  

可以使用registerScope方法来注册相应的scope
 
java 代码
 
  1. applicationContext.getBeanFactory().registerScope("myScope", scope);     
  

另外一种实现 xml 配置(建议使用)
  通过CustomScopeConfigurer 来注册相应的Scope,由于CustomScopeConfigurer 实现了BeanFactoryPostProcessor,对于ApplcationContext,自动会实现相应的配置
 
xml 代码
 
  1. <bean id="myScope" class="MyScope"/>  
  2. <bean id="customerScope" class="org.springframework.beans.factory.config.CustomScopeConfigurer">  
  3.     <property name="scopes">  
  4.         <map>  
  5.             <entry key="myScope">  
  6.                 <bean class="myScope"/>  
  7.             </entry>  
  8.         </map>  
  9.     </property>  
  10. </bean>  
  11. <bean id="usesScope" class="org.springframework.beans.TestBean" scope="myScope"/>   
  

当然也可以编程实现
 
java 代码
 
  1. Map scopes = new HashMap();  
  2. scopes.put(thisnew NoOpScope());                          
  3. CustomScopeConfigurer figurer = new CustomScopeConfigurer();  
  4. figurer.setScopes(scopes);       


   发表时间:2007-01-04  
  虽然Spring提供了这个扩展功能,但我觉得这项功能基本上没有什么意义,只要用好Spring自定义的
singleton,prototype,request,session和globalSession就够了。这种功能是拿来宣传的,而不是实战的。
0 请登录后投票
   发表时间:2007-01-05  
    从意义上来说,实用性是不强,可作为一个好的框架,提供足够的灵活性,那就另当别论了。
1 请登录后投票
   发表时间:2007-01-10  
   一个框架成熟后,有时添加的功能往往是为了独善其身,要是不提供这样的功能,竞争者并会在比较时拿来做为论据,但作为开发者,这些完善性的功能,是需要学习代价的。
0 请登录后投票
   发表时间:2007-01-10  
stamen 写道
  虽然Spring提供了这个扩展功能,但我觉得这项功能基本上没有什么意义,只要用好Spring自定义的
singleton,prototype,request,session和globalSession就够了。这种功能是拿来宣传的,而不是实战的。


一个场景:

例如在银行的柜面交易,我要存入10k,并转账20k到另一个帐户,从我与柜面的小姐开始打交道,到我离开柜台,假设这是一个 session,而每次发生的交易都是一个 long time transaction(因为金额数目或者其它原因,例如需要授权等,这并不是一个单一的 request),这时候需要有一个 transaction scope 的 bean 来临时存放我的数据,在我离开柜台后销毁。这时候就需要有 transaction scope 了,而这个 scope 是需要自己实现的。

当然,实际上银行不是用这种方式来 manage transaction 的。这里只是一个虚拟的例子而已。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics