青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shuffy

不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

面向切面編程

Posted on 2011-10-18 00:16 Shuffy 閱讀(1428) 評論(0)  編輯 收藏 引用 所屬分類: Java
    概述  

      Aspect Oriented Programming(AOP),面向切面編程,是一個比較熱門的話題。AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。比如我們最常見的就是日志記錄了,舉個例子,我們現在提供一個服務查詢學生信息的,但是我們希望記錄有誰進行了這個查詢。如果按照傳統的OOP的實現的話,那我們實現了一個查詢學生信息的服務接口(StudentInfoService)和其實現類(StudentInfoServiceImpl.java),同時為了要進行記錄的話,那我們在實現類(StudentInfoServiceImpl.java)中要添加其實現記錄的過程。這樣的話,假如我們要實現的服務有多個呢?那就要在每個實現的類都添加這些記錄過程。這樣做的話就會有點繁瑣,而且每個實現類都與記錄服務日志的行為緊耦合,違反了面向對象的規則。那么怎樣才能把記錄服務的行為與業務處理過程中分離出來呢?看起來好像就是查詢學生的服務自己在進行,但是背后日志記錄對這些行為進行記錄,但是查詢學生的服務不知道存在這些記錄過程,這就是我們要討論AOP的目的所在。AOP的編程,好像就是把我們在某個方面的功能提出來與一批對象進行隔離,這樣與一批對象之間降低了耦合性,可以就某個功能進行編程。

    代碼分析

  我們直接從代碼入手吧,要實現以上的目標,我們可以使用一個動態代理類(Proxy),通過攔截一個對象的行為并添加我們需要的功能來完成。Java中的java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口為我們實現動態代理類提供了一個方案,但是該方案針對的對象要實現某些接口;如果針對的目的是類的話,cglib為我們提供了另外一個實現方案。等下會說明兩者的區別。

     一、接口的實現方案:

  1)首先編寫我們的業務接口(StudentInfoService.java):
  public interface StudentInfoService{
  void findInfo(String studentName);
  }
  及其實現類(StudentInfoServiceImpl.java):
  public class StudentInfoServiceImpl implements StudentInfoService{
  public void findInfo(String name){
  System.out.println("你目前輸入的名字是:"+name);
  }
  }
  2)現在我們需要一個日志功能,在findInfo行為之前執行并記錄其行為,那么我們就首先要攔截該行為。在實際執行的過程中用一個代理類來替我們完成。Java中為我們提供了實現動態代理類的方案:
  1'處理攔截目的的類(MyHandler.java)
  import org.apache.log4j.Logger;
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Proxy;
  import java.lang.reflect.Method;
  public class MyHandler implements InvocationHandler{
  private Object proxyObj;
  private static Logger log=Logger.getLogger(MyHandler.class);
  public Object bind(Object obj){
  this.proxyObj=obj;
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
  }
  public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  Object result=null;
  try{
  //請在這里插入代碼,在方法前調用
  log.info("調用log日志方法"+method.getName());
  result=method.invoke(proxyObj,args); //原方法
  //請在這里插入代碼,方法后調用
  }catch(Exception e){
  e.printStackTrace();
  }
  return result;
  }
  }
  2'我們實現一個工廠,為了方便我們使用該攔截類(AOPFactory.java):
  public class AOPFactory{
  private static Object getClassInstance(String clzName){
  Object obj=null;
  try{
  Class cls=Class.forName(clzName);
  obj=(Object)cls.newInstance();
  }catch(ClassNotFoundException cnfe){
  System.out.println("ClassNotFoundException:"+cnfe.getMessage());
  }catch(Exception e){
  e.printStackTrace();
  }
  return obj;
  }
  public static Object getAOPProxyedObject(String clzName){
  Object proxy=null;
  MyHandler handler=new MyHandler();
  Object obj=getClassInstance(clzName);
  if(obj!=null) {
  proxy=handler.bind(obj);
  }else{
  System.out.println("Can't get the proxyobj");
  //throw
  }
  return proxy;
  }
  }
  3)基本的攔截與其工廠我們都實現了,現在測試(ClientTest.java):
  public class ClientTest{
  public static void main(String[] args){
  StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");
  studentInfo.findInfo("阿飛");
  }
  }
  輸出結果(看你的log4j設置):
  調用log日志方法findInfo
  你目前輸入的名字是:阿飛
  這樣我們需要的效果就出來了,業務處理自己在進行,但是我們實現了日志功能,而業務處理(StudentInfoService)根本不知道存在該行為的。但是Java中提供的動態代理類的實現是針對實現了某些接口的類,如果沒有實現接口的話,不能創建代理類,看以上部分:
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
  看到了沒有?obj.getClass().getInterfaces()要求實現了某些接口。以下提供哪些沒有實現接口的實現方案:

     二、子類的實現方案。

  首先,請上網下CGLib的包,http://sourceforge.net/project/showfiles.php?group_id=56933 。設置好classpath路徑,CGLib與java標準庫提供的實現方案不同,cglib主要是基于實現類(如StudentInfoServiceImpl.java)擴展一個子類來實現。與Dynamic Proxy中的Proxy和InvocationHandler相對應,net.sf.cglib.proxy.Enhancer和MethodInterceptor在CGLib中負責完成代理對象創建和方法截獲處理,產生的是目標類的子類而不是通過接口來實現方法攔截的,Enhancer主要是用于構造動態代理子類來實現攔截,MethodInterceptor(擴展了Callback接口)主要用于實現around advice(AOP中的概念):
  1)我們的業務處理(StudentInfoServiceImpl.java):
  public class StudentInfoServiceImpl{
  public void findInfo(String name){
  System.out.println("你目前輸入的名字是:"+name);
  }
  }
  2)實行一個工具來處理日志功能(AOPInstrumenter.java):
  import net.sf.cglib.proxy.MethodInterceptor;
  import net.sf.cglib.proxy.Enhancer;
  import net.sf.cglib.proxy.MethodProxy;
  import java.lang.reflect.Method;
  import org.apache.log4j.Logger;
  public class AOPInstrumenter implements MethodInterceptor{
  private Logger log=Logger.getLogger(AOPInstrumenter.class);
  private Enhancer enhancer=new Enhancer();
  public Object getInstrumentedClass(Class clz){
  enhancer.setSuperclass(clz);
  enhancer.setCallback(this);
  return enhancer.create();
  }
  public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{
  log.info("調用日志方法"+method.getName());
  Object result=proxy.invokeSuper(o,args);
  return result;
  }
  }
  3)我們來測試一下(AOPTest.java):
  public class AOPTest{
  public static void main(String[] args){
  AOPInstrumenter instrumenter=new AOPInstrumenter();
  StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);
  studentInfo.findInfo("阿飛");
  }
  }
  輸出結果與以上相同。
  CGLib中為實現以上目的,主要提供的類
  1)Enhancer:setCallback(Callback) ,setSuperclass(Class) ,create()返回動態子類Object
  2)MethodInterceptor必須實現的接口:intercept(Object,Method,Object[],MethodProxy)返回的是原方法調用的結果。和Proxy原理一樣。

     三、AOP的基本概念:

  1)aspect(切面):實現了cross-cutting功能,是針對切面的模塊。最常見的是logging模塊,這樣,程序按功能被分為好幾層,如果按傳統的繼承的話,商業模型繼承日志模塊的話根本沒有什么意義,而通過創建一個logging切面就可以使用AOP來實現相同的功能了。
  2)jointpoint(連接點,又叫插入點):連接點是切面插入應用程序的地方,該點能被方法調用,而且也會被拋出意外。連接點是應用程序提供給切面插入的地方,可以添加新的方法。比如以上我們的切點可以認為是findInfo(String)方法。
  3)advice(通知,即附加行為):advice是我們切面功能的實現,它通知程序新的行為。如在logging里,logging advice包括logging的實現代碼,比如像寫日志到一個文件中。advice在jointpoint處插入到應用程序中。以上我們在MyHandler.java中實現了advice的功能
  4)pointcut(切入點):pointcut可以控制你把哪些advice應用于jointpoint上去,通常你使用pointcuts通過正則表達式來把明顯的名字和模式進行匹配應用。決定了那個jointpoint會獲得通知。
  5)introduction:允許添加新的方法和屬性到類中。
  6)target(目標類):是指那些將使用advice的類,一般是指獨立的那些商務模型。比如以上的StudentInfoServiceImpl.
  7)  proxy(代理類):使用了proxy的模式。是指應用了advice的對象,看起來和target對象很相似。
  8)weaving(插入):是指應用aspects到一個target對象創建proxy對象的過程:complie time,classload time,runtime

原文鏈接:http://baike.baidu.com/view/1865230.htm
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品久久久久久久久久久久久 | 亚洲在线播放电影| 亚洲精品老司机| 亚洲破处大片| 亚洲精选一区| 宅男噜噜噜66一区二区66| 亚洲校园激情| 亚洲欧美日韩在线高清直播| 午夜久久黄色| 久久久视频精品| 久热精品在线视频| 欧美激情综合色| 国产精品第13页| 国产精品综合网站| 国内精品久久久久久| 在线观看亚洲精品| 99re6热在线精品视频播放速度| 99在线热播精品免费| 亚洲欧美国产一区二区三区| 久久精精品视频| 欧美成人精品| 日韩视频免费观看高清在线视频| 亚洲一区3d动漫同人无遮挡| 欧美一区激情| 欧美肥婆在线| 国产精品一区二区久激情瑜伽 | 午夜精品久久一牛影视| 久久精品久久综合| 欧美激情亚洲另类| 99综合电影在线视频| 欧美在线视频网站| 欧美福利一区二区| 国产欧美精品va在线观看| 在线观看视频一区二区| 一区二区高清视频| 久久精品午夜| 亚洲欧洲一区二区三区| 亚洲欧美激情一区| 久久躁狠狠躁夜夜爽| 欧美日韩在线一区二区| 国内成+人亚洲| 一区二区三区日韩欧美| 久久久久久久激情视频| 亚洲美女av网站| 久久精品国产77777蜜臀| 欧美日韩成人网| 黄色亚洲网站| 亚洲小少妇裸体bbw| 免费黄网站欧美| 亚洲一区二区三区色| 免费成人av| 国产视频精品免费播放| 中国成人亚色综合网站| 免费在线国产精品| 亚洲综合视频在线| 欧美啪啪一区| 1769国产精品| 欧美一区影院| 日韩小视频在线观看| 久久综合九色综合欧美就去吻| 国产精品免费看片| 99精品国产福利在线观看免费| 久久免费高清视频| 一区二区三区日韩精品视频| 欧美成人dvd在线视频| 好吊色欧美一区二区三区视频| 亚洲主播在线| 亚洲日韩视频| 美女爽到呻吟久久久久| 狠狠色狠狠色综合日日91app| 亚洲欧美视频一区二区三区| 亚洲激情成人网| 浪潮色综合久久天堂| 国产一区二区中文字幕免费看| 亚洲一级黄色片| 亚洲黄色尤物视频| 免费观看成人www动漫视频| 国产亚洲欧美aaaa| 欧美中文字幕在线观看| 宅男噜噜噜66一区二区66| 欧美女人交a| 亚洲精品中文字| 亚洲第一偷拍| 欧美超级免费视 在线| 亚洲第一在线视频| 久久综合九色综合久99| 欧美淫片网站| 国外精品视频| 久久久亚洲高清| 久久国产手机看片| 国产一区二区三区观看| 久久久91精品国产| 欧美一级久久| 国产综合色在线| 久久久久久午夜| 久久久久久久综合| 在线观看亚洲专区| 麻豆精品精华液| 久久综合久久久久88| 亚洲东热激情| 亚洲国产精品久久91精品| 欧美91精品| 一区二区三区精品视频| 一区二区不卡在线视频 午夜欧美不卡在 | 日韩一区二区电影网| 亚洲国语精品自产拍在线观看| 欧美激情欧美狂野欧美精品| 亚洲精品一区在线观看香蕉| 亚洲精品国精品久久99热| 欧美三日本三级少妇三2023| 亚洲欧美国产视频| 午夜欧美不卡精品aaaaa| 国产亚洲永久域名| 免费久久久一本精品久久区| 美女爽到呻吟久久久久| 夜夜爽99久久国产综合精品女不卡| 亚洲精品一区久久久久久| 国产精品xxxxx| 久久精品国产免费观看| 久久香蕉国产线看观看av| 日韩视频免费在线观看| 在线视频亚洲一区| 国产亚洲午夜高清国产拍精品| 另类图片国产| 欧美日韩a区| 欧美在线一二三四区| 久久资源av| 亚洲午夜激情| 欧美在线视频导航| 亚洲精品欧美日韩| 亚洲调教视频在线观看| 精品av久久707| 亚洲精品一区二区三区99| 国产女主播一区| 欧美激情a∨在线视频播放| 欧美日韩免费一区二区三区| 欧美在线啊v| 欧美成人免费网站| 午夜老司机精品| 老鸭窝91久久精品色噜噜导演| 中文国产成人精品| 久久激情中文| 中国成人亚色综合网站| 久久精品国产第一区二区三区最新章节| 亚洲国产精品一区二区尤物区| av成人国产| 韩日午夜在线资源一区二区| 亚洲精品一二三| 激情文学一区| 在线亚洲国产精品网站| 亚洲福利在线看| 亚洲免费在线电影| 亚洲精品乱码久久久久久蜜桃麻豆 | 91久久香蕉国产日韩欧美9色| 国产欧美精品一区二区色综合| 亚洲高清视频一区二区| 国产日韩综合| 99热精品在线观看| 亚洲国产精品尤物yw在线观看| 亚洲专区在线视频| 99国产精品久久久久久久| 久久精品麻豆| 先锋影音久久| 欧美日韩国产另类不卡| 女女同性精品视频| 国产欧美日韩麻豆91| 亚洲狼人综合| 亚洲国产精品一区| 先锋亚洲精品| 亚洲欧美精品一区| 欧美女激情福利| 欧美高清视频在线| 国产亚洲毛片在线| 亚洲小说欧美另类社区| 99热这里只有精品8| 免费在线欧美黄色| 老司机精品视频一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 亚洲人成网站精品片在线观看| 亚洲电影免费观看高清| 久久电影一区| 久久成人资源| 国产欧美日韩不卡| 在线视频一区二区| 亚洲调教视频在线观看| 欧美日韩高清免费| 亚洲激情六月丁香| 最新国产の精品合集bt伙计| 久久九九热免费视频| 久久久久久久精| 国产一区二区黄| 小黄鸭视频精品导航| 久久国产精品72免费观看| 国产精品视频成人| 亚洲影院色在线观看免费| 亚洲欧美视频一区| 国产精品美女在线| 亚洲一区二三| 久久av资源网站| 国产一区视频网站|