熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

反思Spring:由Ruby on Rails想到的

2013-11-23 20:07:54  來源: Java開源技術 
眾所周知RoR裡面的指導原則有

  第一條是較小的軟件這意味著你編寫較少的程序行程序小就能加速開發錯誤也較少使得程序較容易理解維護和增強對編寫較小程序做出貢獻的Ruby的一個特性就是它假設該架構本身能夠並應該處理元數據

  第二條是對配置的協定原理這意味著Rails不用配置文件而是依靠一些簡單的編程協定讓它通過利用應用程序已有的信息和在運行的數據庫解決它需要知道什麼這個問題

  Spring一個非常靈活的一個框架靈活的同時也造成了一定的復雜性我個人眼中的spring應該從RoR學到的東西應該有不用寫一行xml語句就可以配置好AOP常規的事務管理約定高於配置

  當前spring支持的事務管理配置大體有以下兩種配置方式為了方便舉例子所以借用了javaEE技術專家江南白衣的兩段代碼

  ()spring版本支持的事務管理

  代碼

<bean id=baseTxService class=orgspringframeworktransactioninterceptorTransactionProxyFactoryBean
abstract=true
<property name=transactionManager ref=transactionManager/>
<property name=proxyTargetClass value=true/>
<property name=transactionAttributes
<props>
<prop key=get*>PROPAGATION_REQUIREDreadOnly</prop>
<prop key=find*>PROPAGATION_REQUIREDreadOnly</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=orgspringsidebookstoreadminmanagerBookManager/>
</property>
</bean>

  () spring開始支持事務管理的新配置

  代碼

<aop:config proxytargetclass=true
<aop:advisor pointcut=execution(*yourpackagename*Manager*()) adviceref=txAdvice/>
<aop:advisor pointcut=execution(*yourpackagename*Managersave()) adviceref=fooAdvice/>
</aop:config><tx:advice id=txAdvice transactionmanager=transactionManager
<tx:attributes>
<tx:method name=save*/>
<tx:method name=remove*/>
<tx:method name=* readonly=true/>
</tx:attributes>
</tx:advice>
<bean id=bookManager class=orgsprimonsserviceBookManager/>

  上面的二段配置文件代碼是常用的spring事務管理配置

  看完上面的二段代碼的配置和Ruby on Rails沒有一行配置的ActiveRecord相比差太遠相對麻煩拖拉沒有辦法暫時spring實現中事務管理主要也只是這兩種方法

  使用spring通常會與hibernate/ibatis集成作數據訪問層這也是大多java開發人員常用字的技術框架下面如spring和hibernate結合做數據訪問層暫時不討論有泛型存在的情況只是簡單舉一個例子把事務管理放在數據訪問層下面說出我自己心中理想的spring事務管理

  約定高於配置首先規定對於querylistshowgetfind等開頭的方法采用PROPAGATION_REQUIREDreadOnly級的事務定義而對於setsaveupdateremovedelete等開頭的方法采用PROPAGATION_REQUIRED級的事務定義基本上能滿足大部分開發的需要然後只要在需要事務管理配置的類的前加一句元數據即可例如spring針對hibernate開發的@TransactionAop(hibernate)類似的有@TransactionAop(hibernate)@TransactionAop(ibatis)@TransactionAop(jdo)之類元數據的

  舉一個例子看一段代碼其中UserDAO是一個接口大家都應該看得出來只加了一行的元數據@TransactionAop(hibernate)就可以使得這一個UserDAHibernate類有事務管理的功能因為它命名的方法符合spring的約定(當然這不是真的spring中也沒有這一個功能這只是我個人一點想法提出來而已)

  代碼

package orgappfusedaohibernate;

import javautilList;
import orgappfusedaoUserDAO;
import orgappfusemodelUser;
import orgspringframeworkormhibernatesupportHibernateDaoSupport;
span > //假設有下面這一個類
import orgspringframeworkormhibernatesupportannotationsTransactionAop; </span>

<span >@TransactionAop(hibernate)</span>
public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO{

public User getUser(Long userId) {
return (User)thisgetHibernateTemplate()get(Userclass userId);
}

public List getUsers() {
return thisgetHibernateTemplate()find(from User);
}

public void removeUser(Long userId) {
Object user = thisgetHibernateTemplate()load(Userclass userId);
thisgetHibernateTemplate()delete(user);
}
public void saveUser(User user) {
thisgetHibernateTemplate()saveOrUpdate(user);
}
}

  spring的事務定義很靈活很廣定義七種的傳播行為和五種的隔離常量但用得比較多還是PROPAGATION_REQUIRED和PROPAGATION_REQUIREDreadOnly所以我提出上面所述的一點假想可以簡便開發

  簡單就是美
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27984.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.