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/

     

  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/lsx1993/p/4631525.html
Copyright © 2011-2022 走看看