本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9707505
建立时间:2004年12月20日




[java语言]深入浅出 spring AOP (二)
原创空间,  软件技术

邢红瑞 发表于 2005/11/19 18:11:12

 有人问我,为什末使用CGLIB proxy而不使用JDK Dynamic Proxies,这和spring aop使用的原则相关。 1.使用AOP的时候,尽可能的使用接口,而不是使用具体的类,这样就可以使用JDK Dynamic Proxies, 如果目标类没有实现接口,spring使用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();     } } 原则上使用CGLIB,因为既可以使用类,还可以使用接口,JDK proxy 只能代理口。 2.目标类的方法不能是final的,因为spring要生成目标类的子类,任何要advised的方法都要overide,所以不允许final method。


阅读全文(14982) | 回复(2) | 编辑 | 精华
 


回复:深入浅出 spring AOP (二)
原创空间,  软件技术

o(游客)发表评论于2008/1/3 12:53:12

tryrrtret


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:深入浅出 spring AOP (二)
原创空间,  软件技术

df(游客)发表评论于2005/12/9 14:59:09

tryrrtret

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144769172 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号