AutoProxyCreator及其主要的家庭成员
AutoProxyCreator的关系图:
观察类图,我们可以看到AbstractAutoProxyCreate实现了Aware接口,BeanFactoryAware接口使之拥有容器的能力,BeanClassLoaderAware接口使之用于Bean类加载器的能力。
实现AopInfrastructureBean接口:代表该类免被AOP代理的标记接口.若BEan实现了此接口,表明它是一个Spring AOP的基础类,那么这个类是不会被AOP给代理的,即便它匹配pointcut表达式。
实现Ordered接口:使之能排序AutoProxyCreator和处理Aspect执行顺序。(Order值越小,执行优先级越高)
实现ProxyConfig类:该类是一个配置类,主要给后续的AutoProxyCreator或者用户自定义的AutoProxyCreator提供统一配置信息(具体可看类的成员变量)
AdvisedSupport类:本身不会提供任何创建动态代理的方法,只是专注于生成拦截器链(getInterceptorsAndDynamicInterceptionAdvice)委托给子类ProxyCreatorSupport去创建代理对象
ProxyCreatorSupport类:该类最重要的方法就是createAopProxy()方法。该方法主要创建Aop动态代理。创建动态代理还是委托给Aop代理工厂去创建。
ProxyProcessorSupport类:该类是SpringAOP的基础工具类,主要为后续的AutoProxyCreator集群提供一些公共方法的实现。
该类最核心的方法就是evaluateProxyInterfaces。Proxy是采用JDK代理还是cgLib代理取决于这里
该方法主要的功能就是检查beanClass上的接口们。收集合法的接口,然后交给ProxyFactory处理
AnnotationAwareAspectJAutoProxyCreator类:当前最流行的注解模式:AOP动态代理创建器
观察该类的方法,可以发现该类有任何动态代理的创建逻辑,连个Create都没有,而是一些零零碎碎的边角料方法,此时我们推断真正的创建逻辑并不在这里,而是存在它的父类上。该类仅提供一些跟注解相关的逻辑,比如findCandidateAdvisors方法,主要就是用来查找被@Aspect标签标记的类,并将其转换成多个advisors。(关于advisor这个类是Spring自创的概念,传统的AOP行话里是没有这个概念的,因为Advisor类下只持有一个PointCut和一个Advice)(AOP在处理横切逻辑的时候会把Aspect给转换成多个Advisor,然后将Aspect里的PointCut和Advisor壹壹对应起来)那么我们去观察他的父类(AspectJAwareAdvisorAutoProxyCreator)
AspectJAwareAdvisorAutoProxyCreator:在AnnotationAwareAspectJAutoProxyCreator类出来之前,我们主要是通过这个类来实现xml配置版的AspectJ切面自动代理创建。
按理来说创建的逻辑的相当复杂的,但是观察这个类的方法发现并不复杂,只有边边角角的方法。该类中的sortAdvisors方法是针对Advisor的排序方法。souldSkip方法主要是从容器中发现切面类,并将切面类解析成一个个Advisors
既然该类没有相关的创建逻辑,那我们继续观察它的父类(AbstractAdvisorAutoProxyCreator)
AbstractAdvisorAutoProxyCreator:
观察这个类的方法,我们还是没有发现主要的创建逻辑。该类中的getAdvicesAndAdvisorsForBean()方法。该方法主要为某个bean去获取对应的Advices和Advisors
那我们继续观察它的父类(AbstractAutoProxyCreator),该父类是我们频繁接触到的抽象类。相比它的子类,该类出现了许许多多的方法。并且它显示的实现了前面各种类型的BeanPostProcess的方法。
AbstractAutoProxyCreator:
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
该类是一个抽象类
该类继承了ProxyProcessorSupport类(SpringAOP的基础工具类)
实现了SmartInstantiationAwareBeanPostProcessor接口,使之可以介入到SpringIOC容器的Bean的实例化以及初始化的过程。