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
感興致的讀者可以現實測試一下本文實例,信任會有很年夜的收成。