通过阅读SpringAOP源码,根据自己对源码的的理解,总结了Spring AOP是如何实现切面编程的。下面是根据自己理解画的流程图。
用户通过配置XML <aop:aspectj-autoproxy>或@EnableAspectJAutoProxy注解来开启AOP自动代理对象,spring IOC容器在启动时会将配置的目标对象bean、切面及相关通知信息,解析成Advisor对象对应的BeanDefintion,并把代理对象的配置信息保存在ProxyConfig对象中。AbstractAutoProxyCreator继承了ProxyConfig,且实现了SmartInstantiationAwareBeanPostProcessor , BeanFactoryAware接口,这意味着当IOC容器启动时,会创建AbstractAutoProxyCreator对象,实现了BeanFactoryAware意味着,在AbstractAutoProxyCreator实例初始化阶段,BeanFactory自动注入DefaultListableBeanFactory工厂给AbstractAutoProxyCreator实例使用,有BeanFactory对象则可以通过getBean方法来访问容器中所有的通知对象Advisor相关信息.每当调用BeanFactory取得bean对象时,利用实现了SmartInstantiationAwareBeanPostProcessor的后置处理器功能,BeanFactory会在多个阶段自动调用AbstractAutoProxyCreator这个后置处理器的实现方法,这些实现方法用来判断该Bean是否需要代理,判断Bean是否需要的代理的依据是根据该bean对象是否在IOC容器中存在匹配的一个或多个通知Advisor对象,存在则需要代理,否则,就放过。
根据bean对象的信息,从工厂中查询匹配的一个或多个通知Advisor对象,工厂通过Advisor.class类型查询到所有的Advisor类型,然后使用bean的class类型与Advisor对应的目标类型匹配,匹配成功的就取得该通知对象形成集合,并包装成Advisor接口对象集合。
AdvisedSupport从用户定义的信息中取得包含了所有关于目标对象的信息和设置,还包括通知器拦截器等,这个对象是生成AOP代理方法的输入参数。代理工厂ProxyFactory继承了AdvisedSup