亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Spring事務處理及其AOP框架的內幕

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

  ***注:非入門者讀***
  
  SPRing框架中成功吸引人的一點就是容器事務的治理,提供了一個輕量級的容器事務處理,針對的對象是普通的java類,使用Spring事務治理的話,你可以按照自己的業務把一些相關的方法納入其事務治理里面,這就避免了程序員在處理事務的過程中繁瑣的工作.同時這些也是ejb2.X規范里面吸引人的一點,這在spring里面都很好的提供.雖然在跨容器的事務治理,spring里面并沒有提供,但是對于一般的web程序來說,也不需要僅僅為了那些功能而不得不使用ejb.不過,最近jboss的嵌入式的ejb容器也可以做的更小了,也是開源中的選擇之一.無論技術是怎樣發展的,當前,我們先來研究其中AOP實現的方法.
  
  事實上,Spring中的事務處理是通過AOP思想來實現的,Spring AOP與aspect J和JBoss具有很大的不同,首先,使用Spring AOP框架的用戶要記住的一點是,Spring AOP針對的是方法層次上的實現,而其他兩者對字段也提供了支持.說到Spring AOP的內幕,其實也不難,對于有接口的類,使用的是Java內部類提供的Proxy;而對于那些不實現接口的類,使用的是cglib庫,動態創建一個子類來實現.
  
  在Spring AOP中提供了4種處理切入類型:around,before,after,introdUCtion.顧名思義,
  
  1)around是針對具體的某個切入點的方法(比如,現在有個OrderBook方法,around的切入類型是就這個方法的內部調用,是通過java的元數據,在運行時通過Method.invoke來調用,具有返回值,當發生意外的時候會終止.記住的一點是,返回值.);
  
  2)before是在方法調用前調用(在OrderBook方法前調用,但是沒有返回值,同時在通常意外情況下,會繼續運行下一步方法.記住的一點是沒有返回值);
  
  3)after和before剛好相反,沒有什么非凡的地方.
  
  4)introduction是一個更加非凡的,但功能更加強大的切入類型.比如(你現在有Book對象,Computer對象,還有幾十個這種業務對象,現在你希望在每個這樣的對象中都加入一個記錄最后修改的時間.但是你又不希望對每個類都進行修改,因為太麻煩了,同時更重要的一點,破壞了對象的完整性,說不定你以后又不需要這個時間數據了呢...這時怎么辦呢?Spring AOP就為你專門實現這種思想提供了一個切入處理,那就是introduction.introduction可以為你動態加入某些方法,這樣可以在運行時,強制轉換這些對象,進行插入時間數據的動作,更深的內幕就是C++虛函數中的vtable思想).不過這種動態是以性能作為代價的,使用之前要慎重考慮,這里我們談的是技術,所以就認為他是必需的.
  
  好,現在我們就拿第四種來進行舉例說明Spring AOP的強大之處:
  
  1)假設創建了一個BookService接口及其實現方法(你自己的業務對象):
  
  //$ID:BookService.java Created:2005-11-6 by Kerluse Benn
  package com.osiris.springaop;
  
  public interface BookService {
  public String OrderComputerMagazine(String userName,String bookName);
  public String OrderBook(String userName,String bookName);
  }
  
  //$ID:BookServiceImpl.java Created:2005-11-6 by Kerluse Benn
  package com.osiris.springaop;
  
  public class BookServiceImpl implements BookService{
  public String OrderBook(String name,String bookName) {
  // TODO Add your codes here
  String result=null;
  result="訂購"+bookName+"成功";
  return result;
  }
  
  public String OrderComputerMagazine(String userName, String bookName) {
  // TODO Add your codes here
  String result=null;
  result="訂購"+bookName+"成功";
  return result;
  }
  }
  
  2)事實上你還有很多這樣的對象,現在我們希望在每個對象中添加我們的功能最后修改的時間,功能如下:
  
  //$ID:IAuditable.java Created:2005-11-7 by Kerluse Benn
  package com.osiris.springaop.advices.intruduction;
  
  import java.util.Date;
  
  public interface IAuditable {
  void setLastModifiedDate(Date date);
  Date getLastModifiedDate();
  }
  
  3)因為我們使用的切入類型是introduction,Spring AOP為我們提供了一個描述這種類型的接口IntroductionInterceptor,所以我們的切入實現處理,也需要實現這個接口:
  
  //$ID:AuditableMixin.java Created:2005-11-7 by Kerluse Benn
  package com.osiris.springaop.advices.intruduction;
  
  import java.util.Date;
  
  import org.aopalliance.intercept.MethodInvocation;
  import org.springframework.aop.IntroductionInterceptor;
  
  public class AuditableMixin implements IAuditable,IntroductionInterceptor{
  private Date lastModifiedDate;
  
  public Object invoke(MethodInvocation m) throws Throwable {
  // TODO Add your codes here
  if(implementsInterface(m.getMethod().getDeclaringClass())){
  return m.getMethod().invoke(this,m.getArguments());
  //invoke introduced mthod,here is IAuditable
  }else{
  return m.proceed(); //delegate other method
  }
  }
  
  public Date getLastModifiedDate() {
  // TODO Add your codes here
  return lastModifiedDate;
  }
  
  public void setLastModifiedDate(Date date) {
  // TODO Add your codes here
  lastModifiedDate=date;
  }
  
  public boolean implementsInterface(Class cls) {
  // TODO Add your codes here
  return cls.isAssignableFrom(IAuditable.class);
  }
  
  }
  
  4)ok,現在業務對象BookService類有了,自己希望添加的處理也有了IAuditable,那就剩下使用Spring AOP框架的問題了,配置bean.xml文件:
  
  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  <beans>
  <!-- Beans -->
  <bean id="BookServiceTarget" class="com.osiris.springaop.BookServiceImpl" singleton="false"/>
  
  <!-- introduction advice -->
  <bean id="AuditableMixin" class="com.osiris.springaop.advices.intruduction.AuditableMixin" singleton="false"/>
  
  <!-- Introduction advisor -->
  <bean id="AuditableAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor"
  singleton="false">
  <constructor-arg>
  <ref bean="AuditableMixin"/>
  </constructor-arg>
  </bean>
  
  <bean id="BookService" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="target">
  <ref bean="BookServiceTarget"/>
  </property>
  
  <property name="singleton">
  <value>false</value>
  </property>
  
  <!-- force to use cglib -->
  <property name="proxyTargetClass">
  <value>true</value>
  </property>
  
  <!-- introduction methods -->
  <property name="proxyInterfaces">
  <value>com.osiris.springaop.advices.intruduction.IAuditable</value>
  </property>
  
  <property name="interceptorNames">
  <list>
  <value>AuditableAdvisor</value>
  </list>
  </property>
  </bean>
  
  </beans>
  
  以上就是配置文件,現在我們假設使用業務對象如下,這里是一個簡單測試類:
  
  //$ID:MainApp.java Created:2005-11-6 by Kerluse Benn
  package com.osiris.springaop;
  
  import java.util.Date;
  
  import org.springframework.beans.factory.BeanFactory;
  import org.springframework.beans.factory.xml.XmlBeanFactory;
  import org.springframework.core.io.FileSystemResource;
  
  import com.osiris.springaop.advices.intruduction.IAuditable;
  
  public class MainApp {
  /**
  * @param args
  * @author Kerluse Benn
  */
  public static void main(String[] args) throws Exception{
  // TODO Add your codes here
  BeanFactory factory=new XmlBeanFactory(new FileSystemResource("bean.xml"));
  BookService bookService=(BookService)factory.getBean("BookService");
  IAuditable auditable=(IAuditable)bookService;
  System.out.print(bookService.OrderBook("Kerluse Benn","Professional C#"));
  auditable.setLastModifiedDate(new Date());
  System.out.println(" 訂購時間為"+auditable.getLastModifiedDate());
  Thread.sleep(10000);
  System.out.print(bookService.OrderBook("Kerluse Benn","EXPert j2ee one-on-one"));
  auditable.setLastModifiedDate(new Date());
  System.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费少妇高潮久久精品99| 91精品国产91久久| 欧美另类精品xxxx孕妇| 国产一区二区三区在线观看网站| 91高清免费在线观看| 成人免费网站在线| 中文字幕九色91在线| 欧美日韩美女在线观看| 久久最新资源网| 国产亚洲视频中文字幕视频| 国产小视频91| 国产精品视频久久久久| 777国产偷窥盗摄精品视频| 国产精品第七十二页| 欧美激情极品视频| 国产精品三级久久久久久电影| 欧美第一淫aaasss性| 国产亚洲精品高潮| 国产精品亚洲аv天堂网| 日本午夜精品理论片a级appf发布| 国产拍精品一二三| 色樱桃影院亚洲精品影院| 97久久精品在线| 精品女厕一区二区三区| 欧美天天综合色影久久精品| 久久激情五月丁香伊人| 日韩av在线一区二区| 欧美日韩国产精品| 国产精品高潮呻吟久久av野狼| 欧美精品videossex性护士| 亚洲综合一区二区不卡| 日韩中文字幕精品视频| 亚洲国产精品高清久久久| 日韩美女视频中文字幕| 欧美激情喷水视频| 欧美一区三区三区高中清蜜桃| 91精品国产乱码久久久久久久久| 亚洲va久久久噜噜噜久久天堂| 亚洲精品福利资源站| 国产亚洲精品久久久优势| 欧美老女人在线视频| 亚洲精品午夜精品| 亚洲福利在线视频| 成人妇女免费播放久久久| 国产va免费精品高清在线| 亚洲精品久久久一区二区三区| 国产丝袜精品第一页| 亚洲国产成人精品电影| 午夜精品一区二区三区在线播放| 国产精品美女主播在线观看纯欲| 2018国产精品视频| 亚洲免费电影在线观看| 国产中文字幕亚洲| 欧美激情精品久久久久久久变态| 国产精品91视频| 精品毛片三在线观看| 国产精品久久久久久久9999| 欧美日韩亚洲激情| 精品久久久久国产| 日韩中文综合网| 97久久精品人人澡人人爽缅北| 91探花福利精品国产自产在线| 亚洲xxx自由成熟| 色偷偷av一区二区三区| 日韩国产精品视频| 岛国av一区二区| 97精品久久久中文字幕免费| 欧美日产国产成人免费图片| 奇米成人av国产一区二区三区| 一区二区国产精品视频| 精品久久香蕉国产线看观看亚洲| 亚洲free性xxxx护士白浆| 日本一区二区在线免费播放| 色偷偷噜噜噜亚洲男人| 欧美成人精品在线视频| 欧美一级片在线播放| 91亚洲国产精品| 亚洲奶大毛多的老太婆| 欧美亚洲成人网| 一本一道久久a久久精品逆3p| 国产精品视频久| 91禁外国网站| 亚洲欧洲在线免费| 国内精品久久久久影院优| 亚洲www在线| 午夜伦理精品一区| 国产精品v日韩精品| 97久久超碰福利国产精品…| 亚洲韩国青草视频| 欧美日韩国产限制| 欧美激情视频在线免费观看 欧美视频免费一| 欧美视频不卡中文| 精品国内亚洲在观看18黄| 欧美激情中文字幕在线| 成人精品久久一区二区三区| 久热爱精品视频线路一| 欧美视频在线免费看| 欧美一级bbbbb性bbbb喷潮片| 久久免费福利视频| 国产精品视频自拍| 亚洲黄色免费三级| 欧美日韩裸体免费视频| 亚洲精品国精品久久99热| 国产精品视频公开费视频| 国产精品美女视频网站| 国产亚洲一区精品| 欧美美女18p| 神马久久桃色视频| 日韩美女免费线视频| 日本a级片电影一区二区| 国产主播精品在线| 狠狠躁夜夜躁人人爽超碰91| 欧美日韩国产第一页| 欧美在线视频免费观看| 777午夜精品福利在线观看| 亚洲自拍偷拍网址| 亚洲欧美另类人妖| 亚洲黄色片网站| 亚洲精品电影网在线观看| 久久久久久高潮国产精品视| 高清一区二区三区四区五区| 欧美成人精品h版在线观看| 97精品伊人久久久大香线蕉| 国产日韩欧美中文| 成人av.网址在线网站| 日韩久久免费电影| 精品成人69xx.xyz| 日产日韩在线亚洲欧美| 色偷偷av一区二区三区乱| 2018日韩中文字幕| 国产精品久久久一区| 国产精品视频99| 亚洲石原莉奈一区二区在线观看| 日本久久精品视频| 国产成人精品999| 26uuu另类亚洲欧美日本一| 国产精品91久久| 精品视频在线播放| 国产成人精品午夜| 国产精品av在线播放| 亚洲精品视频久久| 精品日韩视频在线观看| 日韩视频在线一区| 97国产suv精品一区二区62| 亚洲香蕉成人av网站在线观看| 中文字幕亚洲一区二区三区| 91亚洲精品在线| 亚洲精品视频播放| 欧美日韩国产一区中文午夜| 国产一区二中文字幕在线看| 亚洲a区在线视频| 欧美自拍视频在线| 久久精品2019中文字幕| 亚洲精品自拍偷拍| 亚洲天堂日韩电影| 欧美壮男野外gaytube| 自拍偷拍亚洲欧美| 狠狠做深爱婷婷久久综合一区| 91视频8mav| 欧美野外wwwxxx| 国产手机视频精品| 亚洲欧洲午夜一线一品| 国产97在线视频| 国产一级揄自揄精品视频|