麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 13:00:14
字體:
來源:轉載
供稿:網友

  一.為什么要用框架和模式
  
  1.為什么要用模式?
  
  因為模式是一種指導,在一個良好的指導下,有助于你完成任務,有助于你作出一個優良的設計方案,達到事半功倍的效果。而且會得到解決問題的最佳辦法。
  
  2.為什么要用框架?
  
  因為軟件系統發展到今天已經很復雜了,非凡是服務器端軟件,設計到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就相當于讓別人幫你完成一些基礎工作,你只需要集中精力完成系統的業務邏輯設計。而且框架一般是成熟,穩健的,他可以處理系統很多細節問題,比如,事物處理,安全性,數據流控制等問題。還有框架一般都經過很多人使用,所以結構很好,所以擴展性也很好,而且它是不斷升級的,你可以直接享受別人升級代碼帶來的好處。
  
  總之:就是讓開發更簡單,讓我們成功
  
  二. AOP
  
  1. AOP是什么?
  
  AOP是OOP的延續,是aspect Oriented PRogramming的縮寫,意思是面向方面編程。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
  
  2. 切面意義何在?
  
  就可以在這層切面上進行統一的集中式權限治理。而業務邏輯組件則無需關心權限方面的問題。也就是說,通過切面,我們可以將系統中各個不同層次上的問題隔離開來,實現統一集約式處理。各切面只需集中于自己領域內的邏輯實現。這一方面使得開發邏輯更加清楚,專業化分工更加易于進行;另一方面,由于切面的隔離,降低了耦合性,我們就可以在不同的應用中將各個切面組合使用,從而使得代碼可重用性大大增強。
  
  3. AOP應用范圍
  
  Authentication 權限
  Caching 緩存
  Context passing 內容傳遞
  Error handling 錯誤處理
  Lazy loading 懶加載
  Debugging  調試
  logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
  Performance optimization 性能優化
  Persistence  持久化
  Resource pooling 資源池
  Synchronization 同步
  Transactions 事務
  
  三.Spring事務處理
  
  1.Spring事務治理能給我們帶來什么?
  
  對于傳統的基于特定事務資源的事務處理而言(如基于JDBC 的數據庫訪問),Spring并不會對其產生什么影響,我們照樣可以成功編寫并運行這樣的代碼。同時,Spring還提供了一些輔助類可供我們選擇使用,這些輔助類簡化了傳統的數據庫操作流程,在一定程度上節省了工作量,提高了編碼效率。
  
  對于依靠容器的參數化事務治理而言,Spring則表現出了極大的價值。Spring本身也是一個容器,只是相對EJB容器而言,Spring顯得更為輕便小巧。我們無需付出其他方面的代價,即可通過Spring實現基于容器的事務治理(本質上來講,Spring的事務治理是基于動態AOP)。
  
  2. Hibernate in Spring
  applicationContext.xml
  
  <!-- Hibernate SessionFactory --><bean id="sessionFactory“
  class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource"><ref local="dataSource" /></property>
  <property name="mappingResources">
  <list><!-- Add list of .hbm.xml files here -->
  <value>org/mzone/model/Tuser.hbm.xml</value>
  <value>org/mzone/model/Article.hbm.xml</value>
  </list>
  </property>
  <property name="hibernateProperties">
  <props>
  <prop  key="hibernate.dialect">net.sf.hibernate.dialect.SybaseDialec</prop>
  <prop key="hibernate.show_sql">True</prop>
  </props>
  </property>
  </bean><!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
  <bean id="transactionManager"
  class="org.springframework.orm.hibernate.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactory" /></property>
  </bean>
  <bean id="baseTXProxy" lazy-init="true"
  
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <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_REQUIRED,readOnly</prop>
  <prop key="remove*">PROPAGATION_REQUIRED</prop>
  <prop key="*">PROPAGATION_REQUIRED</prop>
  </props>
  </property>
  </bean>
  <bean id="userManagerTarget" class="org.mzone.service.impl.UserManagerImpl">
  <property name="userDAO"><ref local="userDAO"/></property>
  <property name="articleDao"><ref local="articleDAO"/></property>
  </bean>
  
  UserDAO.java ArticleDAO.java
  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操作進行了封裝,而HibernateTemplate.execute方法則是一封裝機制的核心,感愛好可以研究一下其實現機制。
  
  借助HibernateTemplate我們可以脫離每次數據操作必須首先獲得Session實例、啟動事務、提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作。從而獲得以上代碼中精干集中的邏輯呈現效果。
  
  org.mzone.service.impl.UserManagerImpl
  public class UserManagerImpl implements UserManager {
  private UserDAO userDao;
  private ArticleDAO articleDao;
  public void saveUserAndArticle(Tuser user, Article article) {
  userDao.saveUser(user);
  articleDao.saveArticle(article);
  }}
  
  測試代碼
  InputStream is = new FileInputStream("applicationContext.xml");
  XmlBeanFactory factory = new XmlBeanFactory(is);UserManager userManager =
  (UserManager )factory.getBean(" baseTxProxy ");
  user = new Tuser();
  article = new Article();
  user.setUsername("hellboys_topic 1");
  user.setPassWord("12345678_topic 1");
  article.setTitle("hellboys_topic 1");
  article.setContent("hellboys_topic 1");
  userManager.saveUserAndArticle(user,article);
  
  注重問題
  UserManager userManager =
  (UserManager )factory.getBean(" baseTxProxy ");UserManager userManager =
  (UserManagerImpl) ctx.getBean("baseTxProxy");java.lang.ClassCastException
  
  原因在于Spring的AOP實現機制,前面曾經提及,Spring中的事務治理實際上是基于動態AOP機制實現,為了實現動態AOP,Spring在默認情況下會使用Java DynamicProxy,但是,Dynamic Proxy要求其代理的對象必須實現一個接口,該接口定義了預備進行代理的方法。而對于沒有實現任何接口的Java Class,需要采用其他方式,Spring通過CGLib10實現這一功能。
  CGLib可以在運行期對Class行為進行修改。由于其功能強大,性能出眾,經常被作為Java Dynamic Proxy
  之外的動態Proxy模式的實現基礎。在Spring、Hibernate中都用到了CGLib類庫。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夜添久久精品亚洲国产精品 | 欧美不卡在线 | 国产精品1区 | 久久精品视频一区二区 | 免费h片| 人禽l交免费视频 | 国产毛毛片一区二区三区四区 | 久久久久久久久淑女av国产精品 | 国产精品伦视频看免费三 | 久久久久久久久国产 | 成人一级黄色大片 | 亚洲第一页中文字幕 | 欧美日韩高清一区二区三区 | 精品一区二区久久久久久按摩 | 日本成年免费网站 | av在线一区二区三区四区 | 欧美伦交 | 久久综合av | 免费啪视频在线观看 | 日韩精品免费一区二区三区 | 欧美日韩一区,二区,三区,久久精品 | 久久91精品视频 | 久久av免费 | 911色_911色sss主站色播 | 国产98色在线 | 日韩在线播放第一页 | 一本色道久久99精品综合蜜臀 | 一色视频| 免费一级欧美在线观看视频 | 污污网站入口 | 精品亚洲午夜久久久久91 | 国产在线一级视频 | 久草经典视频 | 精品亚洲一 | 看免费一级毛片 | 国产一区二区欧美精品 | 免费观看黄色一级视频 | 毛片视频网站在线观看 | 国产一区视频免费观看 | 精品亚洲一 | 免费网站看v片在线a |