5.SpringAop之ProxyFactory

作者: 土豆肉丝盖浇饭 | 来源:发表于2018-01-26 09:30 被阅读10次

    在讲DefaultAdvisorAutoProxyCreator之前,先讲解下ProxyFactory,因为DefaultAdvisorAutoProxyCreator内部生成代理用的就是ProxyFactory

    1.类继承结构

    ProxyFactory

    和ProxyFactoryBean基本相似

    2.解析

    ProxyFactory在继承了ProxyCreatorSupport之后,只要在生成代理前配置好代理对象,代理接口以及通知/通知器/拦截器,然后调用ProxyCreatorSupport的createAopProxy方法得到适配的AopProxy,在调用AopProxy的getProxy()方法即可得到代理对象,下面看下相关的源码

    配置代理对象这些参数,继承了AdivsedSupport之后,默认是都有的,我们看下ProxyFactory其中一个构造函数,都是使用AdivsedSupport里的方法

    public ProxyFactory(Object target) {
            setTarget(target);
            setInterfaces(ClassUtils.getAllInterfaces(target));
        }
    

    接下来看生成代理的部分

    public Object getProxy(ClassLoader classLoader) {
            return createAopProxy().getProxy(classLoader);
        }
    

    用的是ProxyCreatorSupport中的方法,ProxyFactory和ProxyFactoryBean一样,只是整合了一下
    下面我们来看下ProxyFactory使用的例子

    3.使用

    项目结构为


    项目结构

    使用方式为

            ProxyFactory proxyFactory =new ProxyFactory();
            proxyFactory.setInterfaces(HelloService.class);
            proxyFactory.setTarget(new HelloServiceImpl());
            proxyFactory.addAdvice(new TestBeforeAdvice());
            proxyFactory.addAdvice(new TestAfterAdvice());
            proxyFactory.addAdvice(new TestAroundAdvice());
            HelloService helloService = (HelloService) proxyFactory.getProxy();
            helloService.bye("scj");
            helloService.hello("scj");
    

    基本上和ProxyFactoryBean差不多,只不过是编程式的
    附上代码地址

    思考一个问题:为什么声明式要用ProxyFactoryBean,而不能用ProxyFactory,从上面例子就能看出来,我们得到代理对象需要调用getProxy方法,而在spring容器中的对象是直接存在的,需要我们需要用FactoyBean的getObject方法把getProxy执行了

    相关文章

      网友评论

        本文标题:5.SpringAop之ProxyFactory

        本文链接:https://www.haomeiwen.com/subject/fmyvaxtx.html