首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringFramework的ProxyFactory和ProxyFactoryBean实现分析

SpringFramework的ProxyFactory和ProxyFactoryBean实现分析

作者头像
克虏伯
发布2019-04-15 14:44:33
1.3K0
发布2019-04-15 14:44:33
举报

    在此记录下,以便后面用到,再者,如果需要还可以继续更新此文。有些细节步骤被我省略了,建议读者自己去读源码。

1.ProxyFactory

    getProxy()方法,依据我们对Proxy属性的设置,生成JdkDynamicAopProxy或者CglibAopProxy,我们这里分析JdkDynamicAopProxy的场景。原图在Gtihub上。

  • 步骤7处,是JDK的动态代理,当我们调用方法时,实际执行的是JdkDynamicAopProxy的invoke方法。
  • 步骤13处,将advice转为adviceInterceptor。
  • 步骤19处,有递归,不断的处理我们定义的Advice(我们的定义的Advice会被放到一个List中),到最后,才执行真正被代理对象的方法。
  • 调用链的设计,有点奥妙,个人觉得,待仔细分析。为什么这么说,请看下如下三个类的invoke(MethodInvocation)方法。这种方式我在Spring-tx(事物模块)模块中看到过。
org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor
org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor
org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor

2.ProxyFactoryBean

    ProxyFactoryBean不同于ProxyFactory,ProxyFactoryBean是个FactoryBean(如果是熟悉这个interface接口的同学看到这个应该能想到点什么了吧,这里),它有个getObject()方法,Spring IOC在容器中由BeanDefinition生成bean对象时,会调用此方法,将getObject()的返回值作为bean对象。所以我们从getObjects()开始分析起。

     这里我们分析JdkDynamicAopProxy时候的场景。原图在Github上。

  • 步骤14,我们在调用被代理对象的方法时,调用的是JdkDynamicAopProxy的invoke(),之后的操作就和ProxyFactory的一样了,看上面ProxyFactory的分析。
  • 注意步骤2中的实现,关键代码如下,这里interceptorNames中的值多数情况下是Spring bean的ID。
for (String name : this.interceptorNames) {
    if (logger.isTraceEnabled()) {
        logger.trace("Configuring advisor or advice '" + name + "'");
    }

    if (name.endsWith(GLOBAL_SUFFIX)) {
        if (!(this.beanFactory instanceof ListableBeanFactory)) {
            throw new AopConfigException(
                    "Can only use global advisors or interceptors with a ListableBeanFactory");
        }
        addGlobalAdvisor((ListableBeanFactory) this.beanFactory,
                name.substring(0, name.length() - GLOBAL_SUFFIX.length()));
    } else {
        Object advice;
        if (this.singleton || this.beanFactory.isSingleton(name)) {
            //name是bean的Id,所以从beanFactory中直接getBean()即可。
            advice = this.beanFactory.getBean(name);
        } else {
            // It's a prototype Advice or Advisor: replace with a prototype.
            // Avoid unnecessary creation of prototype bean just for advisor chain initialization.
            advice = new PrototypePlaceholderAdvisor(name);
        }
        //将得到的advice加入到拦截器链中
        addAdvisorOnChainCreation(advice, name);
    }
}

    还有很多关键点没有写出来,我个人觉得还是自己去看源码比较好,有些地方很难用有限的语言清晰的描述出来。

3.Reference

  • SpringFramework-3.2.8.RELEASE。
  • 精通Spring 3.x 企业应用开发实战(虽然个人不喜欢精通二字,但是本书还是比较好的,相对其它Spring书籍)。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/05/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.ProxyFactory
  • 2.ProxyFactoryBean
  • 3.Reference
相关产品与服务
云顾问
云顾问(Tencent Cloud Smart Advisor)是一款提供可视化云架构IDE和多个ITOM领域垂直应用的云上治理平台,以“一个平台,多个应用”为产品理念,依托腾讯云海量运维专家经验,助您打造卓越架构,实现便捷、灵活的一站式云上治理。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档