2.2.cglib动态代理
cglib包提供一系列实现,所以代理类修改为:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class ProductProxy implements MethodInterceptor{
private Object targetObject;
public Object newInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);// 回调方法
return enhancer.create();//创建代理对象,和jdk不同的是这里enhancer提供了创建代理对象的方法,不用自己调Proxy.newInstance()
}
@Override
public Object intercept(Object obj, Method arg1, Object[] args, MethodProxy proxy) throws Throwable{
before();
Object realProduct = proxy.invokeSuper(obj, args); // 和jdk不同的是这里实现MethodInterceptor的intercept方法,然后调用MethodProxy的invekeSuper方法
after();
return realProduct;
}
private void before(){} private void after(){} // before、after和静态代理一样
}
public static void main(String[] args){
ProductProxy proxy=new ProductProxy();
RealProduct realProduct= (RealProduct) proxy.newInstance(new RealProduct());
realProduct.addProduct();
}
总结
代理模式其实就是把一些大家都有的操作前置处理后置处理放在代理类的before、after里面。有一个接口类,实际对象implements接口类,代理类会调用实际对象实现接口的方法,并且在这方法前后做before、after操作。
有静态代理、动态代理,静态代理不好,通常都是用动态代理,静态动态的接口类和实际对象类没有区别,区别就在代理类中,代理类里面不管静态动态都有before、after,因为这是代理类要做的事情。
动态代理有两种实现方式:jdk的和cglib的。
jdk和cglib的区别在于:
1、jdk实现java.lang.reflect.InvocationHandler接口invoke,cglib实现net.sf.cglib.proxy.MethodInterceptor接口intercept。
2、在获取实际对象实例newInstance时,jdk是通过java.lang.reflect.Proxy中newInstance来获取,而cglib是通过net.sf.cglib.proxy.Enhancer中create来获取。
使用的多的好像还是jdk方式的。
网友评论