程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java完成靜態署理辦法淺析

java完成靜態署理辦法淺析

編輯:關於JAVA

java完成靜態署理辦法淺析。本站提示廣大學習愛好者:(java完成靜態署理辦法淺析)文章只能為提供參考,不一定能成為您想要的結果。以下是java完成靜態署理辦法淺析正文


一些Java項目中在mybatis與spring整合中有MapperScannerConfigurer的應用,該類經由過程反向署理主動生成基於接口的靜態署理類。

有鑒於此,本文淺析了java的靜態署理。

本文應用靜態署理模仿處置事務的攔阻器。

接口:

public interface UserService {
  public void addUser();
  public void removeUser();
  public void searchUser();
}

完成類:

public class UserServiceImpl implements UserService {
  public void addUser() {
    System.out.println("add user");
  }
  public void removeUser() {
    System.out.println("remove user");
  }
  public void searchUser() {
    System.out.println("search user");
  }
}

java靜態署理的完成有2種方法

1.jdk自帶的靜態署理

應用jdk自帶的靜態署理須要懂得InvocationHandler接口和Proxy類,他們都是在java.lang.reflect包下。

InvocationHandler引見:

InvocationHandler是署理實例的挪用處置法式完成的接口。

每一個署理實例都具有一個聯系關系的InvocationHandler。對署理實例挪用辦法時,這個辦法會挪用InvocationHandler的invoke辦法。

Proxy引見:

Proxy 供給靜態辦法用於創立靜態署理類和實例。

實例(模仿AOP處置事務):

public class TransactionInterceptor implements InvocationHandler {

  private Object target;

  public void setTarget(Object target) {
    this.target = target;
  }
  
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("start Transaction");
    method.invoke(target, args);
    System.out.println("end Transaction");
    return null;
  }

}

測試代碼:

public class TestDynamicProxy {

  @Test
  public void testJDK() {
    TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
    UserService userService = new UserServiceImpl();
    transactionInterceptor.setTarget(userService);
    UserService userServiceProxy =
        (UserService) Proxy.newProxyInstance(
            userService.getClass().getClassLoader(),
            userService.getClass().getInterfaces(),
            transactionInterceptor);
    userServiceProxy.addUser();
  }

}

測試成果:

start Transaction
add user
end Transaction

很顯著,我們經由過程userServiceProxy這個署理類停止辦法挪用的時刻,會在辦法挪用前落後行事務的開啟和封閉。

2. 第三方庫cglib

CGLIB是一個功效壯大的,高機能、高質量的代碼生成庫,用於在運轉期擴大Java類和完成Java接口。

它與JDK的靜態署理的之間最年夜的差別就是:

JDK靜態署理是針對接口的,而cglib是針對類來完成署理的,cglib的道理是對指定的目的類生成一個子類,並籠罩個中辦法完成加強,但由於采取的是繼續,所以不克不及對final潤飾的類停止署理。

實例代碼以下:

public class UserServiceCallBack implements MethodInterceptor {

  @Override
  public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    System.out.println("start Transaction by cglib");
    methodProxy.invokeSuper(o, args);
    System.out.println("end Transaction by cglib");
    return null;
  }

}

測試代碼:

public class TestDynamicProxy {

  @Test
  public void testCGLIB() {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(UserServiceImpl.class);
    enhancer.setCallback(new UserServiceCallBack());
    UserServiceImpl proxy = (UserServiceImpl)enhancer.create();
    proxy.addUser();
  }

}

測試成果:

start Transaction by cglib
add user
end Transaction by cglib

感興致的讀者可以現實測試一下本文實例,信任會有很年夜的收成。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved