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

来源:互联网 发布:淘宝助手 mac版下载 编辑:程序博客网 时间:2024/06/05 23:07

动态代理主要的相关类

类 主要作用 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