ProxyFactoryBean的作用是产生proxy。
Spring 中 ProxyFactoryBean的层次结构:
ProxyFactoryBean的声明如下:
public class ProxyFactoryBean extends AdvisedSupport
implements FactoryBean, BeanFactoryAware, AdvisedSupportListener {
……
private String[] interceptorNames;
private boolean singleton = true;
private boolean freezeProxy = false;
private String targetName;
public void setProxyInterfaces(String[] interfaceNames) throws ClassNotFoundException {}
……
}
AdvisedSupport的声明如下:
public class AdvisedSupport extends ProxyConfig implements Advised {
……
private transient List listeners = new LinkedList();
private List advisors = new LinkedList();
private Advisor[] advisorArray = new Advisor[0];
private List interfaces = new ArrayList();
private transient boolean isActive;
public void setTargetSource(TargetSource targetSource) {}
……
}
public class ProxyConfig implements Serializable {
……
private boolean proxyTargetClass = false;
private boolean optimize = false;
private boolean opaque = false;
protected boolean exposeProxy = false;
private boolean frozen = false;
……
}
ProxyFactoryBean 是提供给用户使用的创建proxy对象的类。所以它的特征是客户化:配置一些名词性的东西,如上述代码中写到的,interceptorNames,singleton,freezeProxy,targetName,proxyInterfaces等等。
ProxyFactoryBean 继承的class和实现的主要interafce 功能分别如下:
FactoryBean interface是为了创建 proxy对象;
AdvisedSupport 提供了对Advice和Advised的良好管理和支持。注意它implement了interface Advised。它的管理是针对对象的管理。它并不是直接提供给用户使用的。如上述代码中写到的,targetSource,advisors,listeners等。跟ProxyFactoryBean进行比较会发现,对于AdvisedSupport管理的targetSource,ProxyFactoryBean管理的相应的是targetName。注意体会和理解为什么会这样。在这需要说明的是,用户配置时,是可以直接配targetSource而不用配targetName的,但这两者其实不尽相同的。关于这点,可能需要专门的阐述一下,主要是
Singleton和Prototype的区别的问题。如果读者不熟悉Singleton和Prototype design pattern,可以先参阅相关的design pattern的文章。
These are not themselves AOP proxies, but subclasses of this class are normally factories from which AOP proxy instances are obtained directly.
This class frees subclasses of the housekeeping of Advices and Advisors, but doesn't actually implement proxy creation methods, which are provided by subclasses.
ProxyConfig 通用代理配置信息提供类。如是否直接代理class而不是interface(proxyTargetClass property),是否需要优化如果存在可优化的情况下(optimize property)。
Convenience super class for configuration used in creating proxies, to ensure that all proxy creators have consistent properties.
从上面的分析可以看出,ProxyFactoryBean借助了AdvisedSupport来管理其Advisor/Advice以及target source,借助ProxyConfig来管理其proxy相关的通用属性,借助FactoryBean 来约束创建proxy的规范,通过这几者的有机结合,就可以创建proxy对象了。由此可见,Spring里的class的职责分配还是是相当的明确、独立、精练的。这个在Spring里其实地方还有很多很多的体现。