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

開源技術分析:AOP和Spring事務處理

2013-11-23 20:12:07  來源: Java開源技術 

  為什麼要用框架和模式
  
  為什麼要用模式?
  
  因為模式是一種指導在一個良好的指導下有助於你完成任務有助於你作出一個優良的設計方案達到事半功倍的效果而且會得到解決問題的最佳辦法
  
  為什麼要用框架?
  
  因為軟件系統發展到今天已經很復雜了特別是服務器端軟件設計到的知識內容問題太多在某些方面使用別人成熟的框架就相當於讓別人幫你完成一些基礎工作你只需要集中精力完成系統的業務邏輯設計而且框架一般是成熟穩健的他可以處理系統很多細節問題比如事物處理安全性數據流控制等問題還有框架一般都經過很多人使用所以結構很好所以擴展性也很好而且它是不斷升級的你可以直接享受別人升級代碼帶來的好處
  
  總之:就是讓開發更簡單讓我們成功
  
   AOP
  
   AOP是什麼?
  
  AOP是OOP的延續是Aspect Oriented Programming的縮寫意思是面向方面編程AOP實際是GoF設計模式的延續設計模式孜孜不倦追求的是調用者和被調用者之間的解耦AOP可以說也是這種目標的一種實現
  
   切面意義何在?
  
  就可以在這層切面上進行統一的集中式權限管理而業務邏輯組件則無需關心權限方面的問題也就是說通過切面我們可以將系統中各個不同層次上的問題隔離開來實現統一集約式處理各切面只需集中於自己領域內的邏輯實現這一方面使得開發邏輯更加清晰專業化分工更加易於進行另一方面由於切面的隔離降低了耦合性我們就可以在不同的應用中將各個切面組合使用從而使得代碼可重用性大大增強
  
   AOP應用范圍
  
  Authentication 權限
  Caching 緩存
  Context passing 內容傳遞
  Error handling 錯誤處理
  Lazy loading 懶加載
  Debugging  調試
  logging tracing profiling and monitoring 記錄跟蹤 優化 校准
  Performance optimization 性能優化
  Persistence  持久化
  Resource pooling 資源池
  Synchronization 同步
  Transactions 事務
  
  Spring事務處理
  
  Spring事務管理能給我們帶來什麼?
  
  對於傳統的基於特定事務資源的事務處理而言(如基於JDBC 的數據庫訪問)Spring並不會對其產生什麼影響我們照樣可以成功編寫並運行這樣的代碼同時Spring還提供了一些輔助類可供我們選擇使用這些輔助類簡化了傳統的數據庫操作流程在一定程度上節省了工作量提高了編碼效率
  
  對於依賴容器的參數化事務管理而言Spring則表現出了極大的價值Spring本身也是一個容器只是相對EJB容器而言Spring顯得更為輕便小巧我們無需付出其他方面的代價即可通過Spring實現基於容器的事務管理(本質上來講Spring的事務管理是基於動態AOP)
  
   Hibernate in Spring
  applicationContextxml
  
  <! Hibernate SessionFactory ><bean id=sessionFactory
  class=orgspringframeworkormhibernateLocalSessionFactoryBean>
  <property name=dataSource><ref local=dataSource /></property>
  <property name=mappingResources>
  <list><! Add list of hbmxml files here >
  <value>org/mzone/model/Tuserhbmxml</value>
  <value>org/mzone/model/Articlehbmxml</value>
  </list>
  </property>
  <property name=hibernateProperties>
  <props>
  <prop  key=hibernatedialect>netsfhibernatedialectSybaseDialec</prop>
  <prop key=hibernateshow_sql>True</prop>
  </props>
  </property>
  </bean><! Transaction manager for a single Hibernate SessionFactory (alternative to JTA) >
  <bean id=transactionManager
  class=orgspringframeworkormhibernateHibernateTransactionManager>
  <property name=sessionFactory><ref local=sessionFactory /></property>
  </bean>
  <bean id=baseTxProxy lazyinit=true
  
  class=orgspringframeworktransactioninterceptorTransactionProxyFactoryBean>
  <property name=transactionManager><ref bean=transactionManager/></property>
  <property name=target>
  <ref local= userManagerTarget />
  </property>
  <property name=transactionAttributes>
  <props>
  <prop key=save*>PROPAGATION_REQUIRED</prop>
  <prop key=get*>PROPAGATION_REQUIREDreadOnly</prop>
  <prop key=remove*>PROPAGATION_REQUIRED</prop>
  <prop key=*>PROPAGATION_REQUIRED</prop>
  </props>
  </property>
  </bean>
  <bean id=userManagerTarget class=orgmzoneserviceimplUserManagerImpl>
  <property name=userDAO><ref local=userDAO/></property>
  <property name=articleDao><ref local=articleDAO/></property>
  </bean>
  
  UserDAOjava ArticleDAOjava
  public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
  public void saveUser(Tuser user) {
  getHibernateTemplate()saveOrUpdate(user);
  }}public class ArticleDAOImpl extends HibernateDaoSupport implements ArticleDAO {
  public void saveArticle(Article article) {
  getHibernateTemplate()saveOrUpdate(article);
  }}
  
  HibernateDaoSupport
  
  實現了HibernateTemplate和SessionFactory實例的關聯HibernateTemplate對Hibernate Session操作進行了封裝而HibernateTemplateexecute方法則是一封裝機制的核心感興趣可以研究一下其實現機制
  
  借助HibernateTemplate我們可以脫離每次數據操作必須首先獲得Session實例啟動事務提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作從而獲得以上代碼中精干集中的邏輯呈現效果
  
  orgmzoneserviceimplUserManagerImpl
  public class UserManagerImpl implements UserManager {
  private UserDAO userDao;
  private ArticleDAO articleDao;
  public void saveUserAndArticle(Tuser user Article article) {
  userDaosaveUser(user);
  articleDaosaveArticle(article);
  }}
  
  測試代碼
  InputStream is = new FileInputStream(applicationContextxml);
  XmlBeanFactory factory = new XmlBeanFactory(is);UserManager userManager =
  (UserManager )factorygetBean( baseTxProxy );
  user = new Tuser();
  article = new Article();
  usersetUsername(hellboys_topic );
  usersetPassword(_topic );
  articlesetTitle(hellboys_topic );
  articlesetContent(hellboys_topic );
  userManagersaveUserAndArticle(userarticle);
  
  注意問題
  UserManager userManager =
  (UserManager )factorygetBean( baseTxProxy );UserManager userManager =
  (UserManagerImpl) ctxgetBean(baseTxProxy);javalangClassCastException
  
  原因在於Spring的AOP實現機制前面曾經提及Spring中的事務管理實際上是基於動態AOP機制實現為了實現動態AOPSpring在默認情況下會使用Java DynamicProxy但是Dynamic Proxy要求其代理的對象必須實現一個接口該接口定義了准備進行代理的方法而對於沒有實現任何接口的Java Class需要采用其他方式Spring通過CGLib實現這一功能
  CGLib可以在運行期對Class行為進行修改由於其功能強大性能出眾常常被作為Java Dynamic Proxy
  之外的動態Proxy模式的實現基礎在SpringHibernate中都用到了CGLib類庫
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28106.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.