基于spring-aop-4.3.12.release
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
public DefaultAopProxyFactory() {
}
/**
* 创建代理
* 1.没有优化,不是代理目标类且不是用户提供的代理接口 -> JDK代理
* 2.否则;不是接口且目标类不是代理类 -> CGLIB
* 3.否则; -> JDK代理
*/
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (!config.isOptimize() && !config.isProxyTargetClass()
&& !this.hasNoUserSuppliedProxyInterfaces(config)) {
return new JdkDynamicAopProxy(config);
} else {
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.");
} else {
return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ?
new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
}
}
}
/**
* 获取的代理接口为空或者,只有一个且是SpringProxy的子类
* 即非用户提供的代理接口
*/
private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
Class<?>[] ifcs = config.getProxiedInterfaces();
return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);
}
}