博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring aop as cglib
阅读量:6948 次
发布时间:2019-06-27

本文共 2634 字,大约阅读时间需要 8 分钟。

hot3.png

spring aop as cglib 博客分类: java

大家都知道spring的aop.而底层是用了jdk的动态代理,还有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[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(); }}

 

转载于:https://my.oschina.net/xiaominmin/blog/1598276

你可能感兴趣的文章
【2014最新】iOS App 提交上架store 详细流程(转)
查看>>
Hands on Machine Learning with sklearn and TensorFlow —— 一个完整的机器学习项目(加州房地产)...
查看>>
正则表达式匹配a标签或div标签
查看>>
《跃迁-成为高手的技术》感悟
查看>>
ANSI设备驱动器
查看>>
面试-2
查看>>
Odoo 10的Linux安装
查看>>
常用概念比较
查看>>
各分支Linux的镜像下载地址
查看>>
读取XML的内容
查看>>
Devil fly
查看>>
结合项目实例 回顾传统设计模式(三)装饰者模式
查看>>
常用性能分析工具
查看>>
JZOJ 1003【东莞市选2007】拦截导弹——dp
查看>>
bzoj 2093 [Poi2010]Frog——滑动窗口
查看>>
Linux的一些基本命令
查看>>
学习笔记——WPF
查看>>
quartus 对比引脚兼容
查看>>
C# Listview 第一列不能居中
查看>>
I.MX6 uSDHC SD card register
查看>>