一.spring对jdk和cglib动态代理的选择
1.查看spring源码:
org.springframework.aop.framework.DefaultAopProxyFactory.java
的
createAopProxy(){}
方法:
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
//◆如果目标对象实现了接口,且强制cglib代理,则使用cglib代理
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.");
}
//◆如果目标对象实现了接口,则采用JDK动态代理
if (targetClass.isInterface()) {
return new JdkDynamicAopProxy(config);
}
//◆如果目标对象没有实现接口,则采用Cglib动态代理
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
2.得出结论:
◆如果目标对象实现了接口,则采用JDK动态代理
◆如果目标对象没有实现接口,则采用Cglib动态代理
◆如果目标对象实现了接口,且强制cglib代理,则使用cglib代理