反思spring:由Ruby on Rails想到的

众所周知,RoR里面的指导原则有:
第一条是较小的软件,这意味着你编写较少的程序行。程序小就能加速开发,错误也较少,使得程序较容易理解、维护和增强。对编写较小程序做出贡献的Ruby的一个特性就是它假设该架构本身能够并应该处理元数据.
第二条是对配置的协定原理,这意味着Rails不用配置文件,而是依靠一些简单的编程协定,让它通过利用应用程序已有的信息和在运行的数据库,解决它需要知道什么这个问题。
Spring一个非常灵活的一个框架,灵活的同时也造成了一定的复杂性。我个人眼中的spring应该从RoR学到的东西应该有:不用写一行xml语句就可以配置好AOP常规的事务管理,约定高于配置。
当前spring支持的事务管理配置,大体有以下两种配置方式,为了方便举例子,所以借用了javaEE技术专家"江南白衣"的两段代码

(1)、spring2.0版本支持的事务管理
代码

< bean  id = " baseTxService "   class = " org.springframework.transaction.interceptor.TransactionProxyFactoryBean "    
              
abstract = " true " >    
            
< property name = " transactionManager "  ref = " transactionManager " />    
            
< property name = " proxyTargetClass "  value = " true " />    
            
< property name = " transactionAttributes " >    
                
< props >    
                    
< prop key = " get* " > PROPAGATION_REQUIRED,readOnly </ prop >    
                    
< prop key = " find* " > PROPAGATION_REQUIRED,readOnly </ prop >    
                    
< prop key = " save* " > PROPAGATION_REQUIRED </ prop >    
                    
< prop key = " remove* " > PROPAGATION_REQUIRED </ prop >    
                
</ props >    
            
</ property >    
            
< property name = " preInterceptors " >    
                
< list >    
                    
< ref bean = " methodSecurityInterceptor " />    
                
</ list >    
            
</ property >    
     
</ bean >    
       
     
< bean id = " bookManager "  parent = " baseTxService " >    
            
< property name = " target " >    
                
< bean  class = " org.springside.bookstore.admin.manager.BookManager " />    
            
</ property >    
     
</ bean >   

 

(2)、 spring2.0开始支持事务管理的新配置
代码

< aop:config proxy - target - class = " true " >    
        
< aop:advisor pointcut = " execution(*yourpackagename..*Manager.*(..)) "  advice - ref = " txAdvice " />    
        
< aop:advisor pointcut = " execution(*yourpackagename..*Manager.save(..)) "  advice - ref = " fooAdvice " />    
    
</ aop:config >< tx:advice id = " txAdvice "  transaction - manager = " transactionManager " >    
        
< tx:attributes >    
            
< tx:method name = " save* " />    
            
< tx:method name = " remove* " />    
            
< tx:method name = " * "  read - only = " true " />    
       
</ tx:attributes >    
    
</ tx:advice >    
    
< bean  id = " bookManager "   class = " org.springside.bookstore.commons.service.BookManager " />   

上面的二段配置文件代码是常用的spring事务管理配置.
看完上面的二段代码的配置,和Ruby on Rails没有一行配置的ActiveRecord相比差太远,相对麻烦拖拉,没有办法,暂时spring实现中事务管理主要也只是这两种方法。

使用spring通常会与hibernate/ibatis集成作数据访问层,这也是大多java开发人员常用字的技术框架.下面如spring和hibernate结合做数据访问层,暂时不讨论有泛型存在的情况,只是简单举一个例子把事务管理放在数据访问层。下面说出我自己心中理想的spring事务管理:

约定高于配置。首先规定,对于query,list,show,get,find等开头的方法采用PROPAGATION_REQUIRED,readOnly级的事务定义;而对于set,save,update,remove,delete等开头的方法采用PROPAGATION_REQUIRED级的事务定义,基本上能满足大部分开发的需要。然后只要在需要事务管理配置的类的前加一句元数据即可,例如spring针对hibernate3开发的@TransactionAop(hibernate3),类似的有@TransactionAop(hibernate2)、@TransactionAop(ibatis)、@TransactionAop(jdo)之类元数据的

举一个例子看一段代码,其中UserDAO是一个接口,大家都应该看得出来,只加了一行的元数据@TransactionAop(hibernate3)就可以使得这一个UserDAHibernate类有事务管理的功能,因为它命名的方法符合spring的约定。(当然,这不是真的,spring中也没有这一个功能,这只是我个人一点想法提出来而已)
代码

package  org.appfuse.dao.hibernate;   
  
import  java.util.List;   
import  org.appfuse.dao.UserDAO;   
import  org.appfuse.model.User;   
import  org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
span style
= " color:blue; " >     // 假设有下面这一个类   
import  org.springframework.orm.hibernate3.support.annotations.TransactionAop; </ span >    
  
< span style = " color:blue; " > @TransactionAop(hibernate3) </ span >    
public   class  UserDAOHibernate  extends  HibernateDaoSupport  implements  UserDAO {   
       
    
public User getUser(Long userId) {   
        
return (User)this.getHibernateTemplate().get(User.class, userId);   
    }
   
  
    
public List getUsers() {   
         
return this.getHibernateTemplate().find("from User");   
    }
   
  
    
public void removeUser(Long userId) {   
        Object user 
= this.getHibernateTemplate().load(User.class, userId);   
        
this.getHibernateTemplate().delete(user);   
    }
   
    
public void saveUser(User user) {   
        
this.getHibernateTemplate().saveOrUpdate(user);   
    }
   
}
  

spring的事务定义很灵活很广,定义七种的传播行为和五种的隔离常量,但用得比较多还是PROPAGATION_REQUIRED和PROPAGATION_REQUIRED,readOnly,所以我提出上面所述的一点假想,可以简便开发。
简单就是美。
这是昨晚写了一个小时多一点的文章,现在发上博客,哈哈........ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值