spring aop as cglib
2016-03-10 16:05
423 查看
大家都知道spring的aop.而底层是用了jdk的动态代理,还有cglib.
一般来说代理接口的话就用jdk的动态代理。而当没有接口的时候就用cglib
jdk的动态代理底层是通过生成一个子类实现目标接口,继承 Proxy类,然后在加上eqs ,tostring,hashcode方法
而cglib及可以代理接口,也可以代理类。底层是通过生成一个子类来继承目标类。然后重写里面的方法。因为是继承,所以fianl的方法是重写不了的,代理不了的。下面来看一下cglib具体的代理是如何实现的。
一般来说代理接口的话就用jdk的动态代理。而当没有接口的时候就用cglib
jdk的动态代理底层是通过生成一个子类实现目标接口,继承 Proxy类,然后在加上eqs ,tostring,hashcode方法
而cglib及可以代理接口,也可以代理类。底层是通过生成一个子类来继承目标类。然后重写里面的方法。因为是继承,所以fianl的方法是重写不了的,代理不了的。下面来看一下cglib具体的代理是如何实现的。
接口类 package org.tatan.test; public interface Worker { void doSomeWork(int numOfTimes); } 目标类 package org.tatan.test; public class WorkerBean implements Worker { public void doSomeWork(int numOfTimes) { for (int i = 0; i < numOfTimes; i++) { System.out.print(""); } } } Advice执行流程 package org.tatan.test; import java.lang.reflect.Method; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class AroundAdvice implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { Object returnValue = invocation.proceed(); Method m = invocation.getMethod(); Object target = invocation.getThis(); Object[] args = invocation.getArguments(); System.out.println("Executed method: " + m.getName()); System.out.println("On object of type: " + target.getClass().getName()); System.out.println("With arguments:"); for (int i=0;i<args.length;i++) { System.out.println("---->" + args[i]); } System.out.println(); return returnValue; } } 运行 package org.tatan.test; import org.springframework.aop.framework.ProxyFactory; public class AOPExample2 { public static void main(String[] args) { Worker bean = getWorkerBean(); bean.doSomeWork(100000000); } private static Worker getWorkerBean() { WorkerBean target = new WorkerBean(); ProxyFactory pf = new ProxyFactory(); pf.setTarget(target); pf.addAdvice(new AroundAdvice()); pf.setInterfaces(new Class[]{Worker.class}); return (Worker) pf.getProxy(); } } 如果调用了setInterfaces();就不要cglib了,使用JDK Dynamic Proxies,只是使用JDK Dynamic Proxies程序执行的效率比较低。 使用CGLIB的Frozen效率比标准的CGLIB效率高。 package org.tatan.test; import org.springframework.aop.framework.ProxyFactory; public class AOPExample2 { public static void main(String[] args) { Worker bean = getWorkerBean(); bean.doSomeWork(100000000); } private static Worker getWorkerBean() { WorkerBean target = new WorkerBean(); ProxyFactory pf = new ProxyFactory(); pf.setTarget(target); pf.addAdvice(new AroundAdvice()); // pf.setInterfaces(new Class[]{Worker.class}); pf.setFrozen(true); return (Worker) pf.getProxy(); } }
相关文章推荐
- Java免费开源数据库、Java嵌入式数据库、Java内存数据库
- java Volatile 变量
- 模拟JDK动态代理
- java actor模型和消息传递实现分析
- JDK动态代理源码Proxy
- Jenkins+Maven进行Java项目持续集成
- eclipse查看jar包中class的中文注释乱码问题的解决
- jps,jstack检测java死锁
- java.lang.NoSuchMethodError:org.springframework.core.GenericTypeResolver.resolve
- 解决maven引用jdk中的tools.jar报Missing artifact的问题
- struts2中类型转换
- java forEach实现原理
- java String 之字节码解析
- Java获取文件后缀的方式
- Hazelcast: Java分布式内存网格框架(平台)
- 淘宝JAVA中间件Diamond详解(1)-简介&amp;快速使用
- 解决eclipse闪退的办法
- Java图像处理库 Sanselan
- jdk 版本差异之 DateFormat.getDateInstance()
- JAVA线程池(ThreadPoolExecutor)源码分析