本文主要分析 spring aop DefaultAopProxyFactory.java 里面 选择默认代理逻辑
主要方法
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
// 如果指定了 optimize为true 或者是proxyTargetClass 为true 或者是 没有实现接口
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.");
}
// 目标类是接口 或者是 class是由代理类动态通过getProxyClass方法 或者 newProxyInstance方法生成
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
} // 否则 cglib 代理
return new ObjenesisCglibAopProxy(config);
}
// 否则使用jdk 动态代理
else {
return new JdkDynamicAopProxy(config);
}
}
指定或者是没有实现接口 cgilib
否则 jdk 动态代理