国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

開源技術分析: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類庫。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开封县| 衡水市| 秦皇岛市| 安陆市| 治多县| 怀集县| 汾阳市| 铜川市| 抚宁县| 阿拉善右旗| 墨脱县| 昌邑市| 玉环县| 安远县| 岱山县| 平谷区| 陕西省| 图们市| 临桂县| 库车县| 泗水县| 泸西县| 牙克石市| 渝中区| 芜湖市| 滨州市| 农安县| 江西省| 清苑县| 文水县| 盐津县| 奉节县| 五原县| 新龙县| 锡林郭勒盟| 柯坪县| 屏边| 土默特左旗| 睢宁县| 南乐县| 平远县|