Proxy代理(AOP实现原理)

时间:2023-03-09 09:03:20
Proxy代理(AOP实现原理)

AOP基于动态代理实现:返回代理对象

java.lang.reflect 包Proxy 类,构造代理类。newProxyInstance() 就是创建代理对象的方法。

Proxy.newProxyInstance

ClassLoader,用于加载代理类的 Loader 类,通常这个 Loader 和被代理的类是同一个 Loader 类。
Interfaces,是要被代理的那些那些接口。
InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。
  1. publicstaticObject newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throwsIllegalArgumentException{
  2. if(h ==null){
  3. thrownewNullPointerException();
  4. }
  5. Class cl = getProxyClass(loader, interfaces);
  6. try{
  7. Constructor cons = cl.getConstructor(constructorParams);
  8. return(Object) cons.newInstance(newObject[]{ h });
  9. }catch(NoSuchMethodException e){
  10. thrownewInternalError(e.toString());
  11. }catch(IllegalAccessException e){
  12. thrownewInternalError(e.toString());
  13. }catch(InstantiationException e){
  14. thrownewInternalError(e.toString());
  15. }catch(InvocationTargetException e){
  16. thrownewInternalError(e.toString());
  17. }
  18. }

调用目标方法:InvocationHandler

用户调用目标方法都被代理到 InvocationHandler 类中定义的唯一方法 invoke 中。

构造代理类的是在 ProxyGenerator 的 generateProxyClass 的方法中。 ProxyGenerator 类在 sun.misc 包下。
如何在 InvocationHandler 上做文章就是 Spring 实现 Aop 的关键所在。JdkDynamicAopProxy 类实现了 InvocationHandler 接口。
前面提到 Spring Aop 也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了 FactoryBean 的 ProxyFactoryBean,FactoryBean 之所以特别就在它可以让你自定义对象的创建方法。当然代理对象要通过 Proxy 类来动态生成。

设计模式分析

Spring 中使用的设计模式也很多,比如工厂模式、单例模式、模版模式等,在《 Webx 框架的系统架构与设计模式》、《 Tomcat 的系统架构与模式设计分析》已经有介绍,这里就不赘述了。这里主要介绍代理模式和策略模式
        在上面结构图中与标准的策略模式结构稍微有点不同,这里抽象策略是 AopProxy 接口,Cglib2AopProxy 和 JdkDynamicAopProxy 分别代表两种策略的实现方式,ProxyFactoryBean 就是代表 Context 角色,它根据条件选择使用 Jdk 代理方式还是 CGLIB 方式,而另外三个类主要是来负责创建具体策略对象,ProxyFactoryBean 是通过依赖的方法来关联具体策略对象的,它是通过调用策略对象的 getProxy(ClassLoader classLoader) 方法来完成操作。

参考文章

Spring 框架的设计理念与设计模式分析:http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/