如何在不使用spring框架中使用aop的功能

Spring框架的AOP機制可以讓開發者把業務流程中的通用功能抽取出來,單獨編寫功能代碼。在業務流程執行過程中,Spring框架會根據業務流程要求,自動把獨立編寫的功能代碼切入到流程的合適位置。

spring提供瞭兩種方式的AOP使用

使用xml配置方式

在這裡插入圖片描述

使用註解方式

在這裡插入圖片描述

這裡需要註意的是Spring AOP目前僅僅支持方法級別的切面,成員的interception並沒有實現。另外,spring aop僅僅是集成框架,並沒有參與aop的具體開發。

如果想利用aop的更多功能,或者在不使用spring的框架中使用aop的功能,該怎麼辦呢?

AspectJ簡介

在這裡插入圖片描述

spring aop集成瞭AspectJ(可以和java編程語言無縫結合的一個面向切面編程的可擴展框架)

AspectJ的使用實例

Eclipse Marketplace安裝插件AJDT

在這裡插入圖片描述

創建Aspect工程

在這裡插入圖片描述

創建AspectJ測試類

在這裡插入圖片描述

創建一個切面Aspect文件

在這裡插入圖片描述

.aj文件

在這裡插入圖片描述

運行HelloAspectJDemo的java程序,結果為:

在這裡插入圖片描述

不使用spring的aop功能實現日志輸出

第一種

public class TimeBook {undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 //審核數據的相關程序
 public void doAuditing(String name){undefined
  logger.log(Level.INFO, name + "開始審核數據...");
  System.out.println("審核程序");
  logger.log(Level.INFO, name + "審核數據結束...");
 }
}
//TestHelloWorld.java
package com.gc.test;
import com.gc.action.TimeBook;
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  TimeBook timeBook = new TimeBook();
  timeBook.doAuditing("張三");
 }
}

第二種:通過面向接口編程實現日志輸出

public class TimeBook implements TimeBookInterface {undefined
 //審核數據的相關程序
 public void doAuditing(String name){undefined
  System.out.println("審核程序");
 }
}
//TimeBookProxy.java
package com.gc.action;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import com.gc.impl.TimeBookInterface;
public class TimeBookProxy {undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 private TimeBookInterface timeBookInterface;
 //在該類中針對前面的接口TimeBookInterface編程,而不是針對具體的類
 public TimeBookProxy(TimeBookInterface timeBookInterface){undefined
  this.timeBookInterface = timeBookInterface;
 }
 //實際業務處理
 public void doAuditing(String name){undefined
  logger.log(Level.INFO,"開始審核數據 "+name);
  timeBookInterface.doAuditing(name);
  logger.log(Level.INFO,"審核數據結束 "+name);
 }
}
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
  timeBookProxy.doAuditing("張三");
 }
}

第三種:使用java的代理機制進行日志輸出

public class LogProxy implements InvocationHandler{undefined
 private Logger logger = Logger.getLogger(this.getClass().getName());
 private Object delegate;
 //綁定代理對象
 public Object bind(Object delegate){undefined
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(),this);
 }
 //針對接口編程
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {undefined
  Object result = null;
  try{undefined
   //在方法調用前後進行日志輸出
   logger.log(Level.INFO,args[0]+" 開始審核數據...");
   result = method.invoke(delegate, args);
   logger.log(Level.INFO,args[0]+" 審核數據結束...");
  }catch(Exception e){undefined
   logger.log(Level.INFO,e.toString());
  }
  return result;
 }
}
//TimeBookInterface.java
package com.gc.impl;
//針對接口編程
public interface TimeBookInterface {undefined
 public void doAuditing(String name);
}
//TimeBook.java
public class TimeBook implements TimeBookInterface {undefined
 //審核數據的相關程序
 public void doAuditing(String name){undefined
  System.out.println("審核程序");
 }
}
//TestHelloWorld.java
public class TestHelloWorld {undefined
 public static void main(String[] args){undefined
  //實現瞭對日志類的重用
  LogProxy logProxy = new LogProxy();
  TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
  timeBookProxy.doAuditing("張三");
 }
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: