zoukankan      html  css  js  c++  java
  • 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/

     

  • 相关阅读:
    api接口出现Provisional headers are shown,
    yii消息提示扩展
    php中普通类 接口类 抽象类 浅谈
    读韭菜的自我修养
    读李笑来的《把时间当作朋友》
    Spring整合Struts2框架的第二种方式(Action由Spring框架来创建)(推荐大家来使用的)
    Spring整合Struts2框架的第一种方式(Action由Struts2框架来创建)。在我的上一篇博文中介绍的通过web工厂的方式获取servcie的方法因为太麻烦,所以开发的时候不会使用。
    Spring框架整合Struts2框架的传统方法
    ecplice中代码使用快捷键无法格式化,使用其他方法将代码格式化的步骤
    SSH框架整合jar包时的注意事项
  • 原文地址:https://www.cnblogs.com/lsx1993/p/4631525.html
Copyright © 2011-2022 走看看