## 1. 什么是代理代理、
Jdk代理:
假如我們的業務需要符合一定的要求,做一些相關的業務,我們可以使用動態代理
## 2.怎么理解動態代理
## 3.代碼
public interface IService {
public String BeforeAdvice(int id);
public String AfterAdvice(int id);
}
public class IServiceImpl implements IService {
public String BeforeAdvice(int id){
System.out.println("-------------advice--------------");
return "前置通知"+id;
}
public String AfterAdvice(int id){
return "后置通知"+id;
}
}
public class MyInvovationHandler implements InvocationHandler{
private Object target; //們既然要做代理,我們必須知道我們是給誰做代理,這里的
obj就是被代理者。
Object result = null;
public MyInvovationHandler(){
super();
}
public MyInvovationHandler(Object target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("BeforeAdvice".equals(method.getName())){ System.out.println("+++++++
++
++before+++++++++++++"+method.getName()+"+++++++++++++++");
result = method.invoke(target,args); System.out.println("+++++++++++after+++++++++++++"+method.getName()+"++++
+++++++++++");
}else{
result = method.invoke(target, args);
}
return result;
}
}
public class MainQ {
public static void main(String[] args) {
IServiceImpl iService = new IServiceImpl();
MyInvovationHandler invocationHandler = new MyInvovationHandler(iService);
//通過剛才創建的InvocationHandler,創建真正的代理者。第一個參數是類加載器,第二個參數是這
// 個代理者實現哪些接口(與被代理者實現的是相同的接口)
IService userServiceProxy = (IService) Proxy.newProxyInstance(iService.getClass().getClassLoader(),
iService.getClass().getInterfaces(), invocationHandler);
System.out.println(userServiceProxy.BeforeAdvice(1));
System.out.println(userServiceProxy.AfterAdvice(1));
}
}
## cglib代理
public class CglibProxy implements MethodInterceptor{
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
throws Throwable {
System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");
System.out.println(method.getName());
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println("++++++before " + methodProxy.getSuperName() + "++++++");
return o1;
}
}
public class MainThread {
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
Enhancer enhancer = new Enhancer(); //主要的增強類
enhancer.setSuperclass(IServiceImpl.class); //設置父類,被增強的類
enhancer.setCallback(cglibProxy); //回調對象
IService o = (IService) enhancer.create();//用cglibProxy來增強UserServiceImpl
o.BeforeAdvice(1);
}
}
## 總結:
### Jdk代理
我們定義了一個接口,里面有兩個方法,然后重寫這個兩個方法, 接著寫一個類用于實現InvocationHandler
然后重寫里面的方法invoke方法里面有三個參數,第一個參數是代理對象,第二個方法是:真實對象的方法,第三個參數是方法的 代理,然后通過Proxy.newProxyInstance()該方法第一個參數是實現類對象的加載器,實現類對象的實現接口,第三個是我們定義的處理方法
### Cglib代理
實現了MethodInterceptor方法,重寫了intercept方法第一個參數是對象,第二個參數是方法,第三個是參數,第四個是代理類對象,然后通過反射類對象執行,
Cglib代理類的調用實現過程
第一步: 創建代理類對象
CglibProxy cglibProxy = new CglibProxy();
第二步:創建增強類對象
Enhancer enhancer = new Enhancer()
enhancer.setSuperclass(IServiceImpl.class)
第三步:設置回調接口
enhancer.setCallback(cglibProxy)
第四步: 用cglibProxy來增強UserServiceImpl
IService o = (IService) enhancer.create();
第五步:調用方法
o.BeforeAdvice(1);