## 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);