最近在回顾spring aop;想想这个aop很简单,无非就是一个面向切面编程.spring aop只支持对方法的连接点。实际中也是最通用的形式。aop的实现就是就是代理。现在对代理写点笔记。
可以通过配置文件或者编程的方式来使用Spring AOP。
配置可以通过xml文件来进行,大概有四种方式:
配置ProxyFactoryBean,显式地设置advisors, advice, target等
配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象
通过<aop:config>来配置
通过<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 方法拦截器 和 回调函数来实现代理效果的