Spring 动态代理(四)- 动态代理核心类 - ProxyCreatorSupport

动态代理主要的相关类

主要作用
AdvisedSupport注册被代理目标对象、通知,和需要代理的接口
ProxyCreatorSupport注册和触发监听器,借助DefaultAopProxyFactory获取代理
DefaultAdvisorAdapterRegistry将Advice包装成Advisor(DefaultPointcutAdvisor); 借助AdvisorAdapter,将Advisor包装成MethodInterceptor
DefaultAdvisorChainFactory借助DefaultAdvisorAdapterRegistry将Advisor集合转换成MethodInterceptor集合
JdkDynamicAopProxy生成jdk动态代理
CglibAopProxy生成Cglib动态代理

ProxyCreatorSupport

ProxyCreatorSupport是spring动态代理比较重要的类,该类的继承层次如下:

ProxyCreatorSupport

动态代理核心步骤

1. ProxyCreatorSupport

无论使用什么动态代理主要都是设置如下三种信息,而spring的类ProxyCreatorSupport(父类:AdvicedSupport)就是用于设置并保存这些信息的。

  • 设置被代理对象target
  • 设置代理接口
  • 设置通知advice

2. Advice

通知也是一种bean,要代理其他对象,首先要获取通知(Advice)bean,然后将Advice 包装成Advisor(DefaultPointcutAdvisor)。这个步骤主要是由DefaultAdvisorAdapterRegistry来做,DefaultAdvisorAdapterRegistry会判断Advice是否合法,然后包装成Advisor,支持的通知类型如下:
* Advisor
* MethodInterceptor
* MethodBeforeAdvice
* AfterReturningAdvice
* ThrowsAdvice

@Override
    public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException {
        if (adviceObject instanceof Advisor) {
            return (Advisor) adviceObject;
        }
        if (!(adviceObject instanceof Advice)) {
            throw new UnknownAdviceTypeException(adviceObject);
        }
        Advice advice = (Advice) adviceObject;
        if (advice instanceof MethodInterceptor) {
            // So well-known it doesn't even need an adapter.
            return new DefaultPointcutAdvisor(advice);
        }
        for (AdvisorAdapter adapter : this.adapters) {
            // Check that it is supported.
            if (adapter.supportsAdvice(advice)) {
                return new DefaultPointcutAdvisor(advice);
            }
        }
        throw new UnknownAdviceTypeException(advice);
    }

后三者MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice的判断是通过在DefaultAdvisorAdapterRegistry注册三种AdviceAdapter实现的。

public DefaultAdvisorAdapterRegistry() {
        registerAdvisorAdapter(new MethodBeforeAdviceAdapter());
        registerAdvisorAdapter(new AfterReturningAdviceAdapter());
        registerAdvisorAdapter(new ThrowsAdviceAdapter());
    }

3. List advisors

获取通知后,会存储到AdvisedSupport的List集合中,AdvisedSupport中有一个List和一个数组来保存Advisor,数组的存在就是为了内部操作方便。

    /**
     * List of Advisors. If an Advice is added, it will be wrapped
     * in an Advisor before being added to this List.
     */
    private List<Advisor> advisors = new LinkedList<Advisor>();

    /**
     * Array updated on changes to the advisors list, which is easier
     * to manipulate internally.
     */
    private Advisor[] advisorArray = new Advisor[0];

4. 创建代理createAopProxy()

无论是ProxyFactoryBean 还是ProxyFactory创建代理都是调用其父类ProxyCreatorSupport的createAopProxy()方法。

5. AopProxyFactory

ProxyCreatorSupport创建代理是通过内部的代理工厂DefaultAopProxyFactory来实现的。

6. AopProxy

DefaultAopProxyFactory会根据代理ProxyCreatorSupport的配置来决定是采用jdk还是cglib动态代理,无论是那种代理,都返回AopProxy,然后在ProxyCreatorSupport调用代理(AopProxy)的getProxy方法获取代理对象。

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                return new JdkDynamicAopProxy(config);
            }
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

7. JDK、CGLIB

jdk:
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
cglib:
Enhancer enhancer = new Enhancer();
 //设置代理类
enhancer.setSuperclass(clazz);
//设置回调拦截
enhancer.setCallback(this);
return enhancer.create();

Spring 动态代理(一) - 代理模式

Spring 动态代理(二) - ProxyFactoryBean

Spring 动态代理(三) - BeanNameAutoProxyCreator

Spring 动态代理(四)- 动态代理核心类 - ProxyCreatorSupport

Spring 动态代理(五) - 自定义BeanTypeAutoProxyCreator

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值