
正文
spring 代理
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java动态代理实现
1. Java自带的动态代理,反射生成字节码
2. Cglib调用asm生成子类
spring 中代理实现
1. 如果类实现了接口,使用java动态代理
2. 没有实现接口,使用cglib,生成子类字节码
原因:
1. jdk自带动态代理性能比cglib较好(待确认)
2. jdk自带动态代理,需要继承接口,不够灵活
spring 代理对象生成源码
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)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
代码可以很清楚看到,什么时候使用jdk动态代理,什么时候使用cglib






