AOP如何选择创建代理对象的方式
关于AOP如何选择创建代理对象的方法,需要看DefaultAopProxyFactory的createAopProxy:
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
//如果设置了显式优化(在代理对象创建后,对增强的修改不在生效)
//或者设置直接通过目标类来代理,而不是接口
//或者是springProxy接口获取其子类
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代理Proxy,就用JDK代理来创建代理对象
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
//否则用CGLIB创建代理对象
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}