Spring AOP 创建代理ProxyFactory
1、ProxyFactory类图
2、ProxyFactory 获取代理对象
public Object getProxy() {
return createAopProxy().getProxy();
}
public Object getProxy(@Nullable ClassLoader classLoader) {
return createAopProxy().getProxy(classLoader);
}
3、ProxyCreatorSupport 获取AopProxy
protected final synchronized AopProxy createAopProxy() {
if (!this.active) {
activate();
}
// getAopProxyFactory()默认是DefaultAopProxyFactory
return getAopProxyFactory().createAopProxy(this);
}
4、DefaultAopProxyFactory创建AopProxy
// 基于Jdk/Cglib创建代理对象
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)) {
// 基于Jdk动态代理-JdkDynamicAopProxy
return new JdkDynamicAopProxy(config);
}
// 基于Cglib动态代理-ObjenesisCglibAopProxy
return new ObjenesisCglibAopProxy(config);
}
else {
// 基于Jdk动态代理-JdkDynamicAopProxy
return new JdkDynamicAopProxy(config);
}
}
// 是否没有提供代理接口,排除SpringProxy接口
private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
Class<?>[] ifcs = config.getProxiedInterfaces();
// Spring创建的代理对象都会实现SpringProxy接口
return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));
}