代理详解

最近在回顾spring aop;想想这个aop很简单,无非就是一个面向切面编程.spring aop只支持对方法的连接点。实际中也是最通用的形式。aop的实现就是就是代理。现在对代理写点笔记。

可以通过配置文件或者编程的方式来使用Spring AOP。

配置可以通过xml文件来进行,大概有四种方式:

  1.    配置ProxyFactoryBean,显式地设置advisors, advice, target等
    
  2.    配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象
    
  3.    通过<aop:config>来配置
    
  4.    通过<aop: aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点
    

注意点:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了

2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB

这里一篇文章很好
http://blog.csdn.net/hintcnuie/article/details/10954631

代理分为静态代理和动态代理两种

静态代理,就是普通的代理模式

因为静态代理需要复写接口中的所有方法 所有重复代码太多 所以出现了动态代理

动态代理 包括 jdk 代理 和gblic 代理

jdk 代理 实现原理

对于JDK 的Proxy,有以下几点:
`` Interface:对于JDK proxy,业务类是需要一个Interface的,这也是一个缺陷

`` Proxy,Proxy 类是动态产生的,这个类在调用Proxy.newProxyInstance(targetCls.getClassLoader, targetCls.getInterface,InvocationHander)之后,会产生一个Proxy类的实例。实际上这个Proxy类也是存在的,不仅仅是类的实例。这个Proxy类可以保存到硬盘上。

`` Method:对于业务委托类的每个方法,现在Proxy类里面都不用静态显示出来

`` InvocationHandler: 这个类在业务委托类执行时,会先调用invoke方法。invoke方法再执行相应的代理操作,可以实现对业务方法的再包装

GBLIC代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

它是通过MethodInterceptor 方法拦截器 和 回调函数来实现代理效果的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容