文章关键词:java代理,jdk动态代理,cglib代理,AOP,切面编程 (由于有代码,文章格式稍乱,请多原谅包涵,代码部分,小伙伴们可以直接点击去iteye博客上看:http://qindongliang.iteye.com/blog/2247670 文中也有百度网盘源码地址可供下载!)
今天,逛技术博客时,无意间发现了一篇有关动态代理模式的文章,感觉写的不错,自己正好也在巩固下基础知识,虽然实际工作中用代理的模式的不是特别多,那是因为你使用的框架,已经帮你封装好了,所以,你可能感觉不到,但是感觉不到不但表不存在,了解下它的原理和使用场景还是能提高下逼格的。于是散仙总结了下文,还有一个实战小例子,用来帮助理解。下面开始: 一:什么是代理? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口; 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。 说白了,代理模式其实就相当于找房子时的中介,你无须找到真实的房东,就可以把租房子这件事给办了,而且因为中介,所以便有了一些额外增强的功能,所以少数中介会提高房价或黑你一下,当然咱们的程序肯定不是跟中介一个德行的。 二:java中代理的种类 (1)静态代理: 只能提供固定的类的代理,局限性比较大 (2)JDK动态代理:只能代理接口,通过反射,提高了灵活性,但性能稍慢 (3)CGLIB代理:Spring AOP的默认实现,可以代理类,无须提供对应接口,通过ASM(asm是Java字节码操控框架,ASM是一套java字节码生成架构,它可以动态生成二进制格式的stub类或其它代理类,或者在类被java虚拟机装入内存之前,动态修改类)字节码增强,速度要快于JDK的默认的动态代理。 三:使用代理的应用场景 这个问题,其实就跟问Spring AOP切面编程的好处,就非常类似了,通过代理模式,我们可以无侵入式的,很方便的实现日志记录功能,方法权限拦截功能,事务控制等功能。 四:实战例子 项目结构:
百度云盘下载: http://pan.baidu.com/s/1eQ0h5YE 1,JDK动态代理,模拟事务控制功能,已经记录方法的耗时功能
Java代码
[java] view plaincopy
Dao接口已经实现类,里面含有测试的方法:
Java代码
[java] view plaincopy
实现类:
Java代码
[java] view plaincopy
JDK动态代理实现:
Java代码
[java] view plaincopy
无接口的cglib代理测试类:
Java代码
[java] view plaincopy
Cglib代理的实现:
Java代码
[java] view plaincopy
测试的代码:
Java代码
[java] view plaincopy
测试JDK动态代理结果:
测试cglib代理结果:
总结:使用代理模式,在一些场景,非常灵活,而且无侵入式的发挥巨大的作用,这就是面向切面编程的核心思想。 参考文章: http://andy136566.iteye.com/blog/967952 http://www.cnblogs.com/coderworld/p/java-reflect.html http://blog.csdn.net/leon709/article/details/9529307 http://www.cnblogs.com/coderworld/p/java-dynamic-proxy.htm