Advised
由持有 AOP 代理工厂配置的类实现的接口。此配置包括拦截器和其他advice、advisor和代理接口。从 Spring 获得的任何 AOP 代理都可以转换为该接口,以允许操作其 AOP 通知。
AdvisedSupport
- AOP代理配置管理器的基类。 此类的子类通常是工厂,从中可以直接获取 AOP 代理实例。此类可释放Advices和Advisor的内部管理子类,但实际上并没有实现代理创建方法,实现由子类提供。
- AdvisedSupport实现了Advised中处理Advisor和Advice的方法,添加Advice时会被包装成一个Advisor,默认使用的Advisor是DefaultPointcutAdvisor,DefaultPointcutAdvisor默认的Pointcut是TruePointcut(转换为一个匹配所有方法调用的Advisor与代理对象绑定)。
- AdvisedSupport同时会缓存对于某一个方法对应的所有Advisor(Map<MethodCacheKey, List<Object>> methodCache),当Advice或Advisor发生变化时,会清空该缓存。getInterceptorsAndDynamicInterceptionAdvice用来获取对应代理方法对应有效的拦截器链 。
ProxyCreatorSupport
继承了AdvisedSupport,ProxyCreatorSupport正是实现代理的创建方法,ProxyCreatorSupport有一个成员变量AopProxyFactory,而该变量的值默认是DefaultAopProxyFactory
public ProxyCreatorSupport() { this.aopProxyFactory = new DefaultAopProxyFactory(); }
我们知道spring生成的代理对象是基于JDK的JdkDynamicAopProxy
或基于CGLIB的ObjenesisCglibAopProxy,spring内部正是委托给
DefaultAopProxyFactory生成代理对象,源码如下:
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);
}
}
List<AdvisedSupportListener> listeners: spring并没有实现该接口的类,主要就是在第一次创建代理时或代理发生变化时触发。
boolean active:第一次创建AOP代理后设置为true【createAopProxy()】
ProxyFactory
继承ProxyCreatorSupport,spring默认创建Proxy对象的一个工厂类。该类有多个重载的构造方法和多个重载的获取代理的方法。此类提供了一种在自定义用户代码中获取和配置 AOP 代理实例的简单方法。
ProxyFactoryBean
以声明/编程的方式使用来实现AOP