cglib代理
前面讲的 静态代理和动态代理(JDK代理) 中目标对象都有实现的接口,如果一个类中没有实现的接口,我们想要对其功能进行扩展,不妨考虑使用cglib代理实现
---Cglib子类代理采用了底层的字节码技术,在内存中动态的构建一个子类对象 。。所以使用cglib子类代理时候,目标对象不能是final 否则无法继承。。
在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑(Jdk动态代理和cglib代理是实现Spring AOP的基础)
普通类Student
1 package cn.secol.cglib_proxy; 2 3 public class Student { 4 public void learn(){ 5 System.out.println("day day up "); 6 } 7 }
代理工厂ProxyFactory
1 package cn.secol.cglib_proxy; 2 3 import java.lang.reflect.Method; 4 5 import net.sf.cglib.proxy.Enhancer; 6 import net.sf.cglib.proxy.MethodInterceptor; 7 import net.sf.cglib.proxy.MethodProxy; 8 9 public class ProxyFactory implements MethodInterceptor { 10 //维护一个目标对象 11 private Object target; 12 13 public ProxyFactory(Object target) { 14 this.target = target; 15 } 16 17 //利用工具类Enhander得到代理对象 18 public Object getProxyInstance(){ 19 //工具类 20 Enhancer en = new Enhancer(); 21 //设置父类 22 en.setSuperclass(target.getClass()); 23 //回调函数 24 en.setCallback(this); 25 //创建子类代理对象 26 return en.create(); 27 } 28 29 @Override 30 public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { 31 32 System.out.println("处理前...."); 33 Object returnValue = method.invoke(target, arg); 34 System.out.println("处理后...."); 35 36 return returnValue; 37 } 38 39 40 }
测试类以及结果:
package cn.secol.cglib_proxy; import org.junit.Test; /** * 测试类 * @author Administrator * */ public class TestDemo { @Test public void fun1(){ //创建目标对象 Student stu = new Student(); //创建代理对象 Student proxy = (Student) new ProxyFactory(stu).getProxyInstance(); System.out.println(proxy.getClass()); proxy.learn(); } } class cn.secol.cglib_proxy.Student$$EnhancerByCGLIB$$8f67ef7c 处理前.... day day up 处理后....
总结:1.使用cglib需要引入cglib-jar文件 2.cglib代理的目标对象不能用final修饰,否则报错
**在Spring AOP编程中 如果目标对象有实现接口,用动态jdk代理 如果目标对象没用实现接口,用cglib代理
posted on 2017-11-17 14:26 OrangeCsong 阅读(115) 评论(0) 编辑 收藏 举报