Spring AOP提供了Aop代理类的工厂类AopProxyFactory,其作用就是创建AopProxy类。
//Aop工厂,创建AOP
public interface AopProxyFactory {
//创建AOP
AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException;
}
AopProxyFactory会创建两种代理类:
(1)jdk提供接口实现的JdkDynamicAopProxy
(2)cglib提供接口实现的ObjenesisCglibAopProxy
在Spring配置文件中配置<aop:aspectj-autoproxy proxy-target-class="true"/>时会默认创建ObjenesisCglibAopProxy,如果没有配置的话就需要根据被代理类是否有接口来选择判断了,如果被代理类由接口则选择使用JdkDynamicAopProxy,否则使用ObjenesisCglibAopProxy,这样选择的原因是由于jdk和cglib实现代理的机制不同来决定的。
@SuppressWarnings("serial")
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
//Spring提供了两种代理类创建方式jdk动态代理和cglib动态代理
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
//AopProxy创建是根据目标类是否有接口
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);
}
}
private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
Class<?>[] ifcs = config.getProxiedInterfaces();
return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));
}
}