一.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代理
本文解析了Spring框架中动态代理的实现原理,详细介绍了如何根据目标对象是否实现了接口来选择使用JDK动态代理还是Cglib动态代理。

1766

被折叠的 条评论
为什么被折叠?



