package org.springframework.aop.framework;
import java.io.Serializable;
import java.lang.reflect.Proxy;
import org.springframework.aop.SpringProxy;
/**
* Default {@link AopProxyFactory} implementation,
* creating either a CGLIB proxy or a JDK dynamic proxy.
*
*/
@SuppressWarnings("serial")
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
@Override
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)) {
//如果该controller、service、dao 实现了接口 使用jdk动态代理
return new JdkDynamicAopProxy(config);
}
// 如果 AdvisedSupport#setOptimize 为TRUE 或者
// 或者 AdvisedSupport#setProxyTargetClass 为TRUE
// 或者 AdvisedSupport#setInterfaces 为TRUE
//使用cglib动态代理
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
总结
//如果该controller、service、dao 实现了接口 使用jdk动态代理
如果 AdvisedSupport#setOptimize 为TRUE 或者
// 或者 AdvisedSupport#setProxyTargetClass 为TRUE
// 或者 AdvisedSupport#setInterfaces 为TRUE
//使用cglib动态代理