1. 程式人生 > >spring aop概念以及jdk的動態代理

spring aop概念以及jdk的動態代理

  AOP(Aspect-Oriented Programming),又稱為面向切面程式設計。作為一種程式設計思想,AOP是 OOP(Object-Oriented Programing面向物件程式設計)一種 補充和完善。

  AOP相關的術語

  1.0 關注點

  關注點就是所關注的與業務無關的公共服務或系統級服務,如日誌記錄,許可權檢查,事務管理等。關注點通常稱為橫切關注點,表示要做什麼。

  2.0 連線點

  連線點就是程式執行過程中明確的階段點,如方法的呼叫或異常的丟擲等。其實,關注點的功能就是新增到相應的連線點。因此,連線點表示在那裡做。在spring aop中,一個連線點總代表一個方法的執行。

  3.0增強

  增強就是在特定的連線點處所執行的處理邏輯,也就是面向連線點注入程式碼。增強通常有稱為增強處理,表示具體做什麼。

  3.1.0 Before Advice 前置處理,在連線點執行前處理。

  3.2.0 AfterReturning Advice後置增強,在連線點成功執行後呼叫。

  3.3.0 AfterThrowing Advice,異常增強,在連線點丟擲異常後被呼叫。

  3.4.0 Around Advice 環境增強,在連線點執行前與執行後被呼叫。

  4.0 切入點

  切入點就是可以插入增強的連線點。

  

 

  Jdk的動態代理

  AOP是基於代理實現的,代理分為2大類,靜態代理與動態代理。靜態代理是在編譯時候生成的,動態代理是在執行的時候生成的。

  下面看一個jdk的動態代理的deom。

  jdk動態代理需要一個介面,以及其實現類。

  定義介面 UserService

  package dflx;

  public interface UserService {

  public void add();

  public void serach();

  }

  以及其實現類UserImpl,和jdk動態代理類MyJdkProxy

  public class UserImpl implements UserService {

  @Override

  public void add() {

  System.out.println( add user);

  }

  @Override

  public void serach() {

  System.out.println(search user);

  }

  }

  class MyJdkProxy implements InvocationHandler{

  private UserService user;

  public MyJdkProxy(UserService user)

  {

  this.user=user;

  }

  public UserService createJDKProxy(){

  return (UserService) Proxy.newProxyInstance(user.getClass().getClassLoader(),

  user.getClass().getInterfaces(),this);

  }

  @Override

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  if(method.getName().equals(add))

  {

  System.out.println(記錄日誌);

  return method.invoke(user, args);

  }else {

  return method.invoke(user, args);

  }

  }

  }

  測試類 MyJdkTest 如下

  package dflx;

  import org.junit.Test;

  public class MyJdkTest {

  @Test

  public void test() {

  //代理物件

  UserService user=new UserImpl();

  //建立代理

  MyJdkProxy myJdkProxy=new MyJdkProxy(user);

  UserService proxy=myJdkProxy.createJDKProxy();

  proxy.add(); //對add方法進行了增強

  proxy.serach();

  }

  }

  對add方法,進行了增強。

  結果如下

  記錄日誌

  add user

  search user