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