Spring Aop源码学习--Aop代理工厂AopProxyFactory

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])));
	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值