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

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Spring事務(wù)處理及其AOP框架的內(nèi)幕

2019-11-18 13:00:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  ***注:非入門者讀***
  
  SPRing框架中成功吸引人的一點(diǎn)就是容器事務(wù)的治理,提供了一個(gè)輕量級(jí)的容器事務(wù)處理,針對(duì)的對(duì)象是普通的java類,使用Spring事務(wù)治理的話,你可以按照自己的業(yè)務(wù)把一些相關(guān)的方法納入其事務(wù)治理里面,這就避免了程序員在處理事務(wù)的過(guò)程中繁瑣的工作.同時(shí)這些也是ejb2.X規(guī)范里面吸引人的一點(diǎn),這在spring里面都很好的提供.雖然在跨容器的事務(wù)治理,spring里面并沒有提供,但是對(duì)于一般的web程序來(lái)說(shuō),也不需要僅僅為了那些功能而不得不使用ejb.不過(guò),最近jboss的嵌入式的ejb容器也可以做的更小了,也是開源中的選擇之一.無(wú)論技術(shù)是怎樣發(fā)展的,當(dāng)前,我們先來(lái)研究其中AOP實(shí)現(xiàn)的方法.
  
  事實(shí)上,Spring中的事務(wù)處理是通過(guò)AOP思想來(lái)實(shí)現(xiàn)的,Spring AOP與aspect J和JBoss具有很大的不同,首先,使用Spring AOP框架的用戶要記住的一點(diǎn)是,Spring AOP針對(duì)的是方法層次上的實(shí)現(xiàn),而其他兩者對(duì)字段也提供了支持.說(shuō)到Spring AOP的內(nèi)幕,其實(shí)也不難,對(duì)于有接口的類,使用的是Java內(nèi)部類提供的Proxy;而對(duì)于那些不實(shí)現(xiàn)接口的類,使用的是cglib庫(kù),動(dòng)態(tài)創(chuàng)建一個(gè)子類來(lái)實(shí)現(xiàn).
  
  在Spring AOP中提供了4種處理切入類型:around,before,after,introdUCtion.顧名思義,
  
  1)around是針對(duì)具體的某個(gè)切入點(diǎn)的方法(比如,現(xiàn)在有個(gè)OrderBook方法,around的切入類型是就這個(gè)方法的內(nèi)部調(diào)用,是通過(guò)java的元數(shù)據(jù),在運(yùn)行時(shí)通過(guò)Method.invoke來(lái)調(diào)用,具有返回值,當(dāng)發(fā)生意外的時(shí)候會(huì)終止.記住的一點(diǎn)是,返回值.);
  
  2)before是在方法調(diào)用前調(diào)用(在OrderBook方法前調(diào)用,但是沒有返回值,同時(shí)在通常意外情況下,會(huì)繼續(xù)運(yùn)行下一步方法.記住的一點(diǎn)是沒有返回值);
  
  3)after和before剛好相反,沒有什么非凡的地方.
  
  4)introduction是一個(gè)更加非凡的,但功能更加強(qiáng)大的切入類型.比如(你現(xiàn)在有Book對(duì)象,Computer對(duì)象,還有幾十個(gè)這種業(yè)務(wù)對(duì)象,現(xiàn)在你希望在每個(gè)這樣的對(duì)象中都加入一個(gè)記錄最后修改的時(shí)間.但是你又不希望對(duì)每個(gè)類都進(jìn)行修改,因?yàn)樘闊┝?同時(shí)更重要的一點(diǎn),破壞了對(duì)象的完整性,說(shuō)不定你以后又不需要這個(gè)時(shí)間數(shù)據(jù)了呢...這時(shí)怎么辦呢?Spring AOP就為你專門實(shí)現(xiàn)這種思想提供了一個(gè)切入處理,那就是introduction.introduction可以為你動(dòng)態(tài)加入某些方法,這樣可以在運(yùn)行時(shí),強(qiáng)制轉(zhuǎn)換這些對(duì)象,進(jìn)行插入時(shí)間數(shù)據(jù)的動(dòng)作,更深的內(nèi)幕就是C++虛函數(shù)中的vtable思想).不過(guò)這種動(dòng)態(tài)是以性能作為代價(jià)的,使用之前要慎重考慮,這里我們談的是技術(shù),所以就認(rèn)為他是必需的.
  
  好,現(xiàn)在我們就拿第四種來(lái)進(jìn)行舉例說(shuō)明Spring AOP的強(qiáng)大之處:
  
  1)假設(shè)創(chuàng)建了一個(gè)BookService接口及其實(shí)現(xiàn)方法(你自己的業(yè)務(wù)對(duì)象):
  
  //$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="訂購(gòu)"+bookName+"成功";
  return result;
  }
  
  public String OrderComputerMagazine(String userName, String bookName) {
  // TODO Add your codes here
  String result=null;
  result="訂購(gòu)"+bookName+"成功";
  return result;
  }
  }
  
  2)事實(shí)上你還有很多這樣的對(duì)象,現(xiàn)在我們希望在每個(gè)對(duì)象中添加我們的功能最后修改的時(shí)間,功能如下:
  
  //$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)因?yàn)槲覀兪褂玫那腥腩愋褪莍ntroduction,Spring AOP為我們提供了一個(gè)描述這種類型的接口IntroductionInterceptor,所以我們的切入實(shí)現(xiàn)處理,也需要實(shí)現(xiàn)這個(gè)接口:
  
  //$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,現(xiàn)在業(yè)務(wù)對(duì)象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>
  
  以上就是配置文件,現(xiàn)在我們假設(shè)使用業(yè)務(wù)對(duì)象如下,這里是一個(gè)簡(jiǎn)單測(cè)試類:
  
  //$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(" 訂購(gòu)時(shí)間為"+auditable.getLastModifiedDate());
  Thread.sleep(10000);
  System.out.print(bookService.OrderBook("Kerluse Benn","EXPert j2ee one-on-one"));
  auditable.setLastModifiedDate(new Date());
  System.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蜜桃免费在线 | 91网页| 欧美一级片在线 | 暴力肉体进入hdxxxx古装 | 美女羞羞视频网站 | www.狠狠插.com| 性 毛片 | 黄色影院在线看 | 色妞视频男女视频 | 在线看免费观看日本 | 久久久久久久久久久综合 | 国产91亚洲精品一区二区三区 | 成年人黄色免费电影 | 91在线播放国产 | 91懂色| av在线不卡免费 | 在线日韩亚洲 | 亚洲婷婷日日综合婷婷噜噜噜 | 羞羞视频免费网站 | 亚洲成人在线视频网 | 毛片一级免费看 | 九九视频精品在线观看 | 免费在线观看午夜视频 | 久草在线视频网 | 久久毛片 | 男女生羞羞视频网站在线观看 | 国产成人小视频在线观看 | 色的综合 | 久久爽精品区穿丝袜 | 免费视频xxxx | 羞羞网站在线看 | 欧美日韩在线播放 | 麻豆porn| 在线观看中文字幕av | 国产午夜精品一区 | av在线免费观看国产 | 国产精品视频在 | 宅男噜噜噜66一区二区 | av在线播放亚洲 | 久久激情小视频 | 欧美日韩国产一区二区三区在线观看 |