Spring架构详解(12):SpringAOP如何实现

转帖|行业资讯|编辑:郝浩|2016-02-26 14:05:31.000|阅读 367 次

概述:代理的目的是调用目标方法时我们可以转而执行InvocationHandler类的invoke方法,所以如何在InvocationHandler上做文章就是Spring实现Aop的关键所在。Spring的Aop实现是遵守Aop联盟的约定。同时Spring又扩展了它,增加了如Pointcut、Advisor等一些接口使得更加灵活。

# 您正在找协同办公软件吗?点击这里站长给您推荐 #

相关链接:

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

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

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

Jdk动态代理的类图
Jdk动态代理的类图

上图清楚的显示了Spring引用了Aop Alliance定义的接口。姑且不讨论Spring如何扩展Aop Alliance,先看看Spring如何实现代理类的,要实现代理类在Spring的配置文件中通常是这样定一个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>true</value></property>
    <property name="interceptorNames">
        <list>
            <value>testInterceptor</value>
            <value>testInterceptor2</value>
        </list>
    </property>
</bean>

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

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

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

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

Spring代理对象的产生
Spring代理对象的产生

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

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

Spring代理对象的产生
Spring调用拦截器

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



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
在线
客服
咨询
电话
400-700-1020
在线
QQ
购物车 反馈 返回
顶部
在线客服系统
live chat