动态代理主要的相关类
类 | 主要作用 |
---|---|
AdvisedSupport | 注册被代理目标对象、通知,和需要代理的接口 |
ProxyCreatorSupport | 注册和触发监听器,借助DefaultAopProxyFactory获取代理 |
DefaultAdvisorAdapterRegistry | 将Advice包装成Advisor(DefaultPointcutAdvisor); 借助AdvisorAdapter,将Advisor包装成MethodInterceptor |
DefaultAdvisorChainFactory | 借助DefaultAdvisorAdapterRegistry将Advisor集合转换成MethodInterceptor集合 |
JdkDynamicAopProxy | 生成jdk动态代理 |
CglibAopProxy | 生成Cglib动态代理 |
ProxyCreatorSupport
ProxyCreatorSupport是spring动态代理比较重要的类,该类的继承层次如下:
动态代理核心步骤
1. ProxyCreatorSupport
无论使用什么动态代理主要都是设置如下三种信息,而spring的类ProxyCreatorSupport(父类:AdvicedSupport)就是用于设置并保存这些信息的。
- 设置被代理对象target
- 设置代理接口
- 设置通知advice
2. Advice
通知也是一种bean,要代理其他对象,首先要获取通知(Advice)bean,然后将Advice 包装成Advisor(DefaultPointcutAdvisor)。这个步骤主要是由DefaultAdvisorAdapterRegistry来做,DefaultAdvisorAdapterRegistry会判断Advice是否合法,然后包装成Advisor,支持的通知类型如下:
* Advisor
* MethodInterceptor
* MethodBeforeAdvice
* AfterReturningAdvice
* ThrowsAdvice
@Override
public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException {
if (adviceObject instanceof Advisor) {
return (Advisor) adviceObject;
}
if (!(adviceObject instanceof Advice)) {
throw new UnknownAdviceTypeException(adviceObject);
}
Advice advice = (Advice) adviceObject;
if (advice instanceof MethodInterceptor) {
// So well-known it doesn't even need an adapter.
return new DefaultPointcutAdvisor(advice);
}
for (AdvisorAdapter adapter : this.adapters) {
// Check that it is supported.
if (adapter.supportsAdvice(advice)) {
return new DefaultPointcutAdvisor(advice);
}
}
throw new UnknownAdviceTypeException(advice);
}
后三者MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice的判断是通过在DefaultAdvisorAdapterRegistry注册三种AdviceAdapter实现的。
public DefaultAdvisorAdapterRegistry() {
registerAdvisorAdapter(new MethodBeforeAdviceAdapter());
registerAdvisorAdapter(new AfterReturningAdviceAdapter());
registerAdvisorAdapter(new ThrowsAdviceAdapter());
}
3. List advisors
获取通知后,会存储到AdvisedSupport的List集合中,AdvisedSupport中有一个List和一个数组来保存Advisor,数组的存在就是为了内部操作方便。
/**
* List of Advisors. If an Advice is added, it will be wrapped
* in an Advisor before being added to this List.
*/
private List<Advisor> advisors = new LinkedList<Advisor>();
/**
* Array updated on changes to the advisors list, which is easier
* to manipulate internally.
*/
private Advisor[] advisorArray = new Advisor[0];
4. 创建代理createAopProxy()
无论是ProxyFactoryBean 还是ProxyFactory创建代理都是调用其父类ProxyCreatorSupport的createAopProxy()方法。
5. AopProxyFactory
ProxyCreatorSupport创建代理是通过内部的代理工厂DefaultAopProxyFactory来实现的。
6. AopProxy
DefaultAopProxyFactory会根据代理ProxyCreatorSupport的配置来决定是采用jdk还是cglib动态代理,无论是那种代理,都返回AopProxy,然后在ProxyCreatorSupport调用代理(AopProxy)的getProxy方法获取代理对象。
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
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);
}
}
7. JDK、CGLIB
jdk:
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
cglib:
Enhancer enhancer = new Enhancer();
//设置代理类
enhancer.setSuperclass(clazz);
//设置回调拦截
enhancer.setCallback(this);
return enhancer.create();
Spring 动态代理(二) - ProxyFactoryBean
Spring 动态代理(三) - BeanNameAutoProxyCreator