s()) { //设置代理接口 copy.setInterfaces( ClassUtils.getAllInterfacesForClass(targetSource.getTargetClass(), this.proxyClassLoader)); } copy.setFrozen(this.freezeProxy); if (logger.isTraceEnabled()) { logger.trace("Using ProxyCreatorSupport copy: " + copy); } //调用ProxyFactory生成AOPProxy代理 return getProxy(copy.createAopProxy()); }//使用createAopProxy方法返回的AOPProxy对象产生AOPProxy代理对象protected Object getProxy(AopProxy aopProxy) { return aopProxy.getProxy(this.proxyClassLoader); }……}
通过源码分析,我们了解到AOPProxyFactory实现了FactoryBean接口,所以本身也是一个Spring的工厂Bean,AOP代理工厂的主要功能概况为:
a.初始化通知器链,将配置的通知器链添加到容器存放通知/通知器的集合中。
b.根据单态模式/原型模式,获取AOPProxy产生AOPProxy代理对象。
(2).AOP创建辅助器(AOPCreatorSupport)获取AOPProxy代理对象:
AOPProxyFactory的getSingletonInstance和newPrototypeInstance方法均通过调用AOPCreatorSupport的createAopProxy()方法获取AOPProxy,主要源码如下:
[java] view plaincopyprint public class ProxyCreatorSupport extends AdvisedSupport { //AOPProxy工厂 private AopProxyFactory aopProxyFactory; //当第一个AOPProxy代理对象被创建时,设置为true private boolean active = false; public AopProxyFactory getAopProxyFactory() { return this.aopProxyFactory; } //默认使用DefaultAopProxyFactory作用AOP代理工厂 public ProxyCreatorSupport() { this.aopProxyFactory = new DefaultAopProxyFactory(); } //创建AOPProxy代理的入口方法 protected final synchronized AopProxy createAopProxy() { if (!this.active) { activate(); } //调用DefaultAopProxyFactory的创建AOPProxy代理的方法 return getAopProxyFactory().createAopProxy(this); } //激活AOP代理配置,向容器注册代理回调监听器,第一次创建AOP代理时调用 private void activate() { this.active = true; for (AdvisedSupportListener listener : this.listeners) { listener.activated(this); } } …… }
通过对ProxyCreatorSupport的源码分析,我们知道真正创建AOPProxy代理对象的是DefaultAopProxyFactory类。
(3).DefaultAopProxyFactory创建AOPProxy代理对象:
DefaultAopProxyFactory是AOP创建辅助器(AOPCreatorSupport)默认的AOP代理工厂,DefaultAopProxyFactory的createAopProxy方法实现了创建AOP代理的功能,源码如下:
[java] view plaincopyprint public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { //判断CGLIB类库是否在classpath中 private static final boolean cglibAvailable = ClassUtils.isPresent("net.sf.cglib.proxy.Enhancer", DefaultAopProxyFactory.class.getClassLoader()); //创建AOP代理对象 public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { //如果AOP使用显式优化,或者配置了目标类,或者只使用Spring支持的代理接口 if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { //获取AOP配置的目标类 Class targetClass = config.getTargetClass(