`

Spring框架的设计理念与设计模式(7)-Spring中AOP特性与实现

阅读更多
关键词:Spring,AOP,Proxy,代理,拦截器
上一章:Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂 http://javapub.iteye.com/blog/751635
下一章:Spring框架的设计理念与设计模式(8)-代理模式                 http://javapub.iteye.com/blog/751652

动态代理的实现原理

要了解Spring的AOP就必须先了解的动态代理的原理,因为AOP就是基于动态代理实现的。动态代理还要从JDK本身说起。

在Jdk的java.lang.reflect包下有个Proxy类,它正是构造代理类的入口。这个类的结构入下:


从上图发现最后面四个是公有方法。而最后一个方法newProxyInstance就是创建代理对象的方法。这个方法的源码如下:

清单6.Proxy.newProxyInstance
public static Object newProxyInstance(ClassLoader loader,  
 
    Class> [] interfaces,  
 
    InvocationHandler h)  
 
    throws IllegalArgumentException {  
 
     
 
        if (h == null) {  
 
        throw new NullPointerException();  
 
    }  
 
    Class cl = getProxyClass (loader, interfaces);  
 
    try {  
 
        Constructor cons = cl.getConstructor(constructorParams);  
 
        return (Object) cons.newInstance(new Object[]  { h });  
 
    } catch (NoSuchMethodException e) {  
 
        throw new InternalError(e.toString());  
 
    } catch (IllegalAccessException e) {  
 
        throw new InternalError(e.toString());  
 
    } catch (InstantiationException e) {  
 
        throw new InternalError(e.toString());  
 
    } catch (InvocationTargetException e) {  
 
        throw new InternalError(e.toString());  
 
    }  
 
}  

这个方法需要三个参数:ClassLoader,用于加载代理类的Loader类,通常这个Loader和被代理的类是同一个Loader类。 Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行 除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法invoke中。这在后面再详解。

下面还是看看Proxy如何产生代理类的过程,他构造出来的代理类到底是什么样子?下面揭晓啦。

其实从上图中可以发现正在构造代理类的是在ProxyGenerator的generateProxyClass的方法中。ProxyGenerator类在sun.misc包下,感兴趣的话可以看看他的源码。

假如有这样一个接口,如下:

清单7.SimpleProxy类
public interface SimpleProxy {  
    public void simpleMethod1();  
    public void simpleMethod2();  
}  

代理来生成的类结构如下:

清单 8.$Proxy2类
public class $Proxy2 extends java.lang.reflect.Proxy implements SimpleProxy{  
 
    java.lang.reflect.Method m0;  
 
    java.lang.reflect.Method m1;  
 
    java.lang.reflect.Method m2;  
 
    java.lang.reflect.Method m3;  
 
    java.lang.reflect.Method m4;  
 
   
 
    int hashCode();  
 
    boolean equals(java.lang.Object);  
 
    java.lang.String toString();  
 
    void simpleMethod1();  
 
    void simpleMethod2();  
 
} 


这个类中的方法里面将会是调用InvocationHandler的invoke方法,而每个方法也将对应一个属性变量,这个属性变量m也将传给invoke方法中的Method参数。整个代理就是这样实现的。

从前面代理的原理我们知道,代理的目的是调用目标方法时我们可以转而执行InvocationHandler类的invoke方法,所以如何在InvocationHandler上做文章就是Spring实现Aop的关键所在。

Spring的Aop实现是遵守Aop联盟的约定。同时Spring又扩展了它,增加了如Pointcut、Advisor等一些接口使得更加灵活。

下面是Jdk动态代理的类图:

上图清楚的显示了Spring引用了Aop Alliance定义的接口。姑且不讨论Spring如何扩展Aop Alliance,先看看Spring如何实现代理类的,要实现代理类在Spring的配置文件中通常是这样定一个Bean的 ,如下:

清单9.配置代理类Bean
<bean id="testBeanSingleton" 
 
    class="org.springframework.aop.framework.ProxyFactoryBean"> 
 
    <property name="proxyInterfaces"> 
 
        <value> 
 
            org.springframework.aop.framework.PrototypeTargetTests$TestBean  
 
        value> 
 
    <property> 
 
    <property name="target"><ref local="testBeanTarget">ref> property> 
 
    <property name="singleton"><value>truevalue>property> 
 
    <property name="interceptorNames"> 
 
        <list> 
 
            <value>testInterceptorvalue> 
 
            <value>testInterceptor2value> 
 
        <list> 
 
    <property> 
 
<bean> 


配置上看到要设置被代理的接口,和接口的实现类也就是目标类,以及拦截器也就在执行目标方法之前被调用,这里Spring中定义的各种各样的拦截器,可以选择使用。

下面看看Spring如何完成了代理以及是如何调用拦截器的。

前面提到Spring Aop也是实现其自身的扩展点来完成这个特性的,从这个代理类可以看出它正是继承了Factory Bean的ProxyFactoryBean,FactoryBean之所以特别就在它可以让你自定义对象的创建 方法。当然代理对象要通过Proxy类来动态生成。

下面是Spring创建的代理对象的时序图:

Spring创建了代理对象后,当你调用目标对象上的方法时,将都会被代理到InvocationHandler类的invoke方法中执行,这在前面已经解释。在这里JdkDynamicAopProxy类实现了InvocationHandler接 口。

下面再看看Spring是如何调用拦截器的,下面是这个过程的时序图:

以上所说的都是Jdk动态代理,Spring还支持一种CGLIB类代理,感兴趣自己看吧。

目录--Spring框架的设计理念与设计模式
Spring框架的设计理念与设计模式(1)-Spring的架构             http://javapub.iteye.com/blog/751539
Spring框架的设计理念与设计模式(2)-Spring的设计理念         http://javapub.iteye.com/blog/751545
Spring框架的设计理念与设计模式(3)-Bean组件                 http://javapub.iteye.com/blog/751550
Spring框架的设计理念与设计模式(4)-Context组件              http://javapub.iteye.com/blog/751625
Spring框架的设计理念与设计模式(5)-Core组件                 http://javapub.iteye.com/blog/751627
Spring框架的设计理念与设计模式(6)-Ioc容器及BeanFactory工厂 http://javapub.iteye.com/blog/751635
Spring框架的设计理念与设计模式(7)-Spring中AOP特性与实现    http://javapub.iteye.com/blog/751642
Spring框架的设计理念与设计模式(8)-代理模式                 http://javapub.iteye.com/blog/751652
Spring框架的设计理念与设计模式(9)-策略模式                 http://javapub.iteye.com/blog/751653
分享到:
评论

相关推荐

    Spring框架的设计理念与设计模式分析之一

    Spring作为现在最优秀的框架之一,被广泛的使用并有很多对其分析的文章。...Spring中又使用了那些设计模式来完成它的这种设计的?它的这种设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。

    Spring框架的设计理念与设计模式分析

    Spring作为现在最优秀的框架之一,被广泛的使用并有很多对其分析的文章。...Spring中又使用了那些设计模式来完成它的这种设计的?它的这种设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。

    Spring框架的设计理念与设计模式

    本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的设计...Spring中又使用了那些设计模式来完成它的这种设计的?它的这种 设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。

    spring框架的设计理念--copy

    Spring 框架的作者设计 Spring 框架的骨骼架构的设计理念,有那几个核心组件?为什么需要这些组件?它们又是如何结合在一起构成 Spring 的骨骼架构?... Spring 中又使用了那些设计模式来完成它的这种设计的?

    第四章:Spring AOP API 设计模式1

    第四章:Spring AOP 设计模式小马哥(mercyblitz)Spring AOP 设计模式抽象工厂模式(Abstract factory)实现构建器模式

    以注解方式模拟Spring IoC AOP

    以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

    你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,《Spring技术内幕:深入解析Spring架构与设计原理》还展示了阅读源代码的卓越方法,不仅授你以鱼...

    掌握Spring设计模式:Java工程师必备指南

    作为一个资深Java工程师,我发现《Spring 设计模式总结》PDF非常精彩,它深入剖析了Spring框架中的关键设计模式。例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过...

    Spring框架研究与探讨

    本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明 了动态代理模式的可行性与有效性。 Aspect Oriented Programming(AOP)是近年来计算机技术中比较...

    使用动态代理演示Spring的AOP编程原理

    其实,Spring没有什么东西,不就是反射技术加设计模式的编程嘛。为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你...

    Spring高级之注解驱动开发视频教程

    系统的学习Spring框架中各个部分,掌握Spring中一些高级特性的使用。 l Spring IoC n 设计模式-工厂模式 n 基础应用-入门案例 n 基础应用-常用注解使用场景介绍及入门 n 高级特性-自定义BeanNameGenerator n 高级...

    Spring框架简介.docx

    Spring 框架本身亦是按照设计模式精心打造, 这使得我们可 以在开发环境中安心的集成 Spring 框架, 不必担心 Spring 是 如何在后台进行工作的。 Spring 框架至今已集成了 20 多个模块。这些模块主要被分如 下图所...

    设计模式之动态代理与spring的aop编程

    NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1747124

    Spring Aop + 海绵宝宝 你的了解是

    Spring是一个开源的轻量级Java企业级应用程序框架,它是为了简化Java应用的开发而设计。Spring框架提供了广泛的功能,帮助开发者快速搭建高效、可维护、可扩展...这种控制反转的设计模式降低了组件之间的可扩展和方便性

    基于Spring的MVC框架设计与实现

    为构建高效、灵活且易于使用的模型-视图-控制器(MVC)模式实现机制,提出一种基于Spring框架的MVC框架。该框架使用JSP 技术构建视图层,采用总体控制与局部控制相结合的方法增强控制层的功能,采用O/R Mapping类完成...

    spring内核详解

    Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的...Spring中又使用了那些设计模式来完成它的这种设计的?它的这种 设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。

    spring-aop-review-tcf.zip

    SpringAOP代理设计模式demo代码实现,从静态代理、动态代理两方面进行了编码实现

    Spring技术内幕:深入解析Spring架构与设计原理

    你不仅能从木书中参透spring框架的优秀架构和设计思想,而且还能从spring优雅的实现源码中一窥java语言的精髓。此外,本书还展示了阅读源代码的卓越方法,不仅授你以鱼,而且还授你以渔!..  如果你以一种淡定的...

Global site tag (gtag.js) - Google Analytics