1
、
ProxyFactoryBean
把
proxy
的创建交给
AopProxy
去做。
public
class
ProxyFactoryBean
extends
AdvisedSupport
implements
FactoryBean, BeanFactoryAware, AdvisedSupportListener
{
public
Object getObject()
throws
BeansException
{
//
invoke AopProxy 去 创建 proxy
return
this
.singleton
?
getSingletonInstance() : newPrototypeInstance(); [good code]
}
//
inherited from ProxyConfig
public
void
setAopProxyFactory(AopProxyFactory apf)
{
this
.aopProxyFactory
=
apf;
}
//
inherited from ProxyConfig
public
AopProxyFactory getAopProxyFactory()
{
return
this
.aopProxyFactory;
}
}
2.
、那么
AopProxy
又如何获取?答案是从
AopProxyFactory
获得。这个
AopProxyFactory
已在
ProxyFactoryBean
掌控范围内,如上述代码所示。
AopProxyFactory interface
如下所示:
public
interface
AopProxyFactory
{
AopProxy createAopProxy(AdvisedSupport advisedSupport)
throws
AopConfigException;
}
3、AopProxy是如何introduce Advised interface的?那要先从AopProxyFactory的implementation说起。
AopProxyFactory
的实现类目前只有
DefaultAopProxyFactory
。这个类的核心方法如下:
public
AopProxy createAopProxy(AdvisedSupport advisedSupport)
throws
AopConfigException
{
if
(advisedSupport.isOptimize()
||
advisedSupport.isProxyTargetClass()
||
advisedSupport.getProxiedInterfaces().length
==
0
)
{
if
(
!
cglibAvailable)
{
throw
new
AopConfigException(
"
Cannot proxy target class because CGLIB2 is not available.
"
+
"
Add CGLIB to the class path or specify proxy interfaces.
"
);
}
return
CglibProxyFactory.createCglibProxy(advisedSupport);
}
else
{
return
new
JdkDynamicAopProxy(advisedSupport);
}
}
这个方法主要是依赖
CglibProxyFactory
类和
JdkDynamicAopProxy
类。这两个类是如何代理所有的接口的呢?
这两个类都是重要接口
AopProxy
的实现类,这个接口的核心方法是
public Object getProxy(ClassLoader classLoader)
。
其中
JdkDynamicAopProxy
实现该方法用到的获取需要代理的接口的代码如下:
public
Object getProxy(ClassLoader classLoader)
{
if
(logger.isDebugEnabled())
{
Class targetClass
=
this
.advised.getTargetSource().getTargetClass();
logger.debug(
"
Creating JDK dynamic proxy
"
+
(targetClass
!=
null
?
"
for [
"
+
targetClass.getName()
+
"
]
"
:
""
));
}
Class[] proxiedInterfaces
=
AopProxyUtils.completeProxiedInterfaces(
this
.advised);
return
Proxy.newProxyInstance(classLoader, proxiedInterfaces,
this
);
}
而
CglibProxyFactory
的
getProxy(ClassLoader classLoader)
方法如下:
public
Object getProxy(ClassLoader classLoader)
{
……
Enhancer enhancer
=
new
Enhancer();
……
enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(
this
.advised));
……
}
从上面可以看出,这两个
AopProxy
实现方案在获取接口时都是通过
AopProxyUtils.completeProxiedInterfaces(this.advised)
获取的。该方法如下:
/**
* Get complete set of interfaces to proxy. This will always add the Advised interface
* unless the AdvisedSupport's "opaque" flag is true.
* @return the complete set of interfaces to proxy
*/
public
static
Class[] completeProxiedInterfaces(AdvisedSupport advised)
{
//
Won't include Advised, which may be necessary.
Class[] specifiedInterfaces
=
advised.getProxiedInterfaces();
Class[] proxiedInterfaces
=
specifiedInterfaces;
if
(
!
advised.isOpaque()
&&
!
advised.isInterfaceProxied(Advised.
class
))
{
//
We need to add the Advised interface.
proxiedInterfaces
=
new
Class[specifiedInterfaces.length
+
1
];
proxiedInterfaces[
0
]
=
Advised.
class
;
System.arraycopy(specifiedInterfaces,
0
, proxiedInterfaces,
1
, specifiedInterfaces.length);
}
return
proxiedInterfaces;
}
从这可以看出,是在这强制加了对
Advised interface
的实现。前提是是否允许代理该
interafce
,这由
isOpaque
方法确定,该方法
Return whether proxies created by this configuration should be prevented from being cast to Advised.
4.
顺便提一下,
Advised interface
的具体实现又是怎样的,在哪呢?
4.1
在
JdkDynamicAopProxy
里,
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
……
if (Advised.class == method.getDeclaringClass()) {
// service invocations on ProxyConfig with the proxy config
return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args);
}
……
}
注意第一个参数是
this.advised
,
其实就是
ProxyFactoryBean
本身,注意在我发表的其天的
Spring
文章里也曾提到,
ProxyFactoryBean extends AdvisedSupport
,
而
AdisedSupport extends ProxyConfig implements Advised
,也就是说
Advised
的默认实现就是
AdisedSupport
。
4.2
在
Cglib2AopProxy
里(如果不熟
Cglib
,建议先看看其天有关的
Cglib
资料),
public Object getProxy(ClassLoader classLoader) {
……
Enhancer enhancer = new Enhancer();
……
enhancer.setCallbackFilter(new ProxyCallbackFilter(this.advised));
……
Callback[] callbacks = getCallbacks(rootClass);
……
……
……
}
private Callback[] getCallbacks(Class rootClass) throws Exception {
……
Callback[] mainCallbacks = new Callback[]{
aopInterceptor, // for normal advice
targetInterceptor, // invoke target without considering advice, if optimized
new SerializableNoOp(), // no override for methods mapped to this
targetDispatcher, this.advisedDispatcher,
new EqualsInterceptor(this.advised)
};
……
}
private class ProxyCallbackFilter implements CallbackFilter {
public int accept(Method method) {
if (method.getDeclaringClass() == Advised.class) {
if (logger.isDebugEnabled()) {
logger.debug("Method " + method + " is declared on Advised - using DISPATCH_ADVISED");
}
return DISPATCH_ADVISED;// DISPATCH_ADVISED
值为
4.
}
……
}
}
private final transient AdvisedDispatcher advisedDispatcher = new AdvisedDispatcher();
/**
* Dispatcher for any methods declared on the Advised class.
*/
private class AdvisedDispatcher implements Dispatcher, Serializable {
public Object loadObject() throws Exception {
return advised;
}
}
注意
Dispatcher extends Callback interface
。