单件的代理对象:
Java代码
private synchronized Object getSingletonInstance() {
if (this.singletonInstance == null) {
this.targetSource = freshTargetSource();
if (this.autodetectInterfaces && getProxiedInterfaces ().length == 0 && !isProxyTargetClass()) {
// 这里设置代理对象的接口
setInterfaces(ClassUtils.getAllInterfacesForClass (this.targetSource.getTargetClass()));
}
// Eagerly initialize the shared singleton instance.
super.setFrozen(this.freezeProxy);
// 注意这里的方法会使用ProxyFactory来生成我们需要的Proxy
this.singletonInstance = getProxy(createAopProxy());
// We must listen to superclass advice change events to recache the singleton
// instance if necessary.
addListener(this);
}
return this.singletonInstance;
}
//使用createAopProxy放回的AopProxy来得到代理对象。
protected Object getProxy(AopProxy aopProxy) {
return aopProxy.getProxy(this.beanClassLoader);
}
ProxyFactoryBean的父类是AdvisedSupport,Spring使用AopProxy接口把AOP代理的实 现与框架的其他部分分离开来;在AdvisedSupport中通过这样的方式来得到AopProxy,当 然这里需要得到AopProxyFactory的帮助 - 下面我们看到Spring为我们提供的实现,来帮 助我们方便的从JDK或者cglib中得到我们想要的代理对象:
Java代码
protected synchronized AopProxy createAopProxy() {
if (!this.isActive) {
activate();
}
return getAopProxyFactory().createAopProxy(this);
}
Spring源代码解析(五):Spring AOP获取Proxy(3)
时间:2011-03-29 javaeye jiwenke
而在ProxyConfig中对使用的AopProxyFactory做了定义:
Java代码
//这个DefaultAopProxyFactory是Spring用来生成AopProxy的地方,
//当然了它包含JDK和Cglib两种实现方式。
private transient AopProxyFactory aopProxyFactory = new DefaultAopProxyFactory();
其中在DefaultAopProxyFactory中是这样生成AopProxy的:
Java代码
public AopProxy createAopProxy(AdvisedSupport advisedSupport) throws AopConfigException {
//首先考虑使用cglib来实现代理对象,当然如果同时目标对象不是接口的实 现类的话
if (advisedSupport.isOptimize() || advisedSupport.isProxyTargetClass() ||
advisedSupport.getProxiedInterfaces().length == 0) {
//这里判断如果不存在cglib库,直接抛出异常。
if (!cglibAvailable) {
throw new AopConfigException(
"Cannot proxy target class because CGLIB2 is not available. " +
"Add CGLIB to the class path or specify proxy interfaces.");
}
// 这里使用Cglib来生成Proxy,如果target不是接口的实现的话,返回 cglib类型的AopProxy
return CglibProxyFactory.createCglibProxy(advisedSupport);
}
else {
// 这里使用JDK来生成Proxy,返回JDK类型的AopProxy
return new JdkDynamicAopProxy(advisedSupport);
}
|