Spring AOP 创建代理ProxyFactory

1、ProxyFactory类图

Spring AOP 创建代理ProxyFactory

 

2、ProxyFactory 获取代理对象

public Object getProxy() {

 return createAopProxy().getProxy();

}

 

public Object getProxy(@Nullable ClassLoader classLoader) {

 return createAopProxy().getProxy(classLoader);

}

 

3、ProxyCreatorSupport 获取AopProxy

protected final synchronized AopProxy createAopProxy() {

 if (!this.active) {

  activate();

 }

 

 // getAopProxyFactory()默认是DefaultAopProxyFactory

 return getAopProxyFactory().createAopProxy(this);

}

 

4、DefaultAopProxyFactory创建AopProxy

// 基于Jdk/Cglib创建代理对象
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)) {

   // 基于Jdk动态代理-JdkDynamicAopProxy

   return new JdkDynamicAopProxy(config);

  }

 

  // 基于Cglib动态代理-ObjenesisCglibAopProxy

  return new ObjenesisCglibAopProxy(config);

 }

 else {

  // 基于Jdk动态代理-JdkDynamicAopProxy

  return new JdkDynamicAopProxy(config);

 }

}

 

// 是否没有提供代理接口,排除SpringProxy接口

private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {

 Class<?>[] ifcs = config.getProxiedInterfaces();

 // Spring创建的代理对象都会实现SpringProxy接口

 return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));

}