15年前6月的一個悶熱的早晨,我爬到一艘老式的玻璃纖維皮劃艇中。它是如此古老,以至于有些小碎片差點插到了我的手指中,而且劃槳長度大約是傳統激流劃槳的兩倍。我游泳的時候要多過劃船,但是這沒有關系。15年之后,我仍然對它著迷。
大約2年前,我試用了在Hibernate站點上突出提到的SPRing項目。我覺得它就像是上面提到的老式皮劃艇:它再適合我不過了。為了進行企業硬編碼,Spring如此深植于我的編程工作中,以至于我使用它作為我第4本java著作《Spring: A Developer's Notebook》的主題。在本文中,我將說明其中的原因。
1. Spring 提供更好的優勢
在河流中,我學會了更多地使用我的腰和背來劃槳,因為我的手臂肌肉無法堅持整日在河上劃槳。我變得更加高效;我獲得了更好的利用率。借助于Spring,我可以使每行代碼做更多的事情。借助于Spring,您可以發現很多額外的手段,其中最大的一處是在持久性方面。下面給出一個Hibernate數據訪問對象中的方法:
public List getReservations( ) { return getHibernateTemplate( ).find("from Reservation");}}
注重您沒有看到的內容。這里沒有事務處理。Spring答應構建配置代碼來處理事務。不必通過關閉會話來治理資源。不必進行自己的配置。不必在這個層次上治理異常,因為異常是未經檢查的??梢宰杂傻卦谧詈线m的位置治理它們。下面給出了另一個Hibernate方法,沒有使用Spring:
public List getBikesOldWay( ) throws Exception { List bikes = null; session s = null; try { s = mySessionFactory.openSession( ); bikes = s.find("from Bike"); }catch (Exception ex) { //handle exception gracefully }finally { s.close( ); } return bikes;
Spring為您提供了更好的優勢。借助于Spring,可以更快地編寫代碼,而進行更少的維護。
2. Spring支持POJO編程
EJB 2.x失敗之后,我們都在尋求表達企業服務而不使用笨拙的模型侵入每個bean的方法。當然,我們需要事務、安全性、持久性,有時還需要遠程控制。對于EJB,我必須學習一個廣泛使用的API,并通過新的工具和部署流程開展工作。我是容器所提供的服務的奴隸。而借助于Spring,我可以選擇自己的服務和持久性框架。我進行POJO編程,并使用配置文件為它們添加企業服務。
在《Spring: A Developer's Notebook》一書中,我構建了一個RentaBike應用程序。我把我的POJO稱作hibRentaBike,而不是會話bean或實體bean;它用作我的數據訪問對象。我還在別處添加了服務。Spring配置文件稱為context,它是一個xml文件,包含容器中所有的bean以及bean所需的屬性和服務。下面讓我們看一看。
目標:
<bean id="rentaBikeTarget" class="com.springbook.HibRentABike"> <property name="storeName"> <value>BrUCe's Bikes</value> </property> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> <property name="transactionManager"> <ref local="transactionManager"/> </property></bean> 攔截器:
<bean name="transactionInterceptor" class="org.springframework.transaction.interceptor.
TransactionInterceptor"> <property name="transactionManager"> <ref local="transactionManager"/> </property> <property name="transactionAttributeSource"> <value> com.springbook.RentABike.transferReservation= PROPAGATION_REQUIRED,-ReservationTransferException com.springbook.RentABike.save*=PROPAGATION_REQUIRED com.springbook.RentABike.*=PROPAGATION_REQUIRED,readOnly </value> </property></bean>
新聞熱點
疑難解答