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

来源:互联网 发布:淘宝店铺怎样加粉丝 编辑:程序博客网 时间:2024/05/22 11:38

Spring AOP提供了Aop代理类的工厂类AopProxyFactory,其作用就是创建AopProxy类。

//Aop工厂,创建AOPpublic interface AopProxyFactory {//创建AOPAopProxy 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动态代理@Overridepublic 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])));}}