【Spring AOP】【一】Spring AOP源码解析文章导读
1 前言
IOC的一些东西我们说过了,这篇我们开始看看AOP,面向切面编程,他也是Spring的一个核心功能,他的作用就是给我们的Bean创建代理对象,进行功能增强,比如我们的事务、日志等,我们主要讲讲他AOP的切入时机,也就是什么时候进场的,以及是怎么解析我们的注解或者在XML里配置的AOP功能,又是怎么代理掉我们的Bean的。
2 AOP相关概念
在看源码之前,我们要先熟悉一下AOP的相关概念,这样能帮助你更好的理解。
-
连接点(Join point):能够被拦截的地方,Spring AOP 是基于动态代理的,所以是方法拦截的,每个成员方法都可以称之为连接点;
-
切点(Poincut):每个方法都可以称之为连接点,我们具体定位到某一个方法就成为切点,看成筛子你要选择哪些连接点进行增强,比如根据类筛选、或者某个方法等都可以。
-
通知(Advice):分前置、后置、异常、环绕、结果通知五种,五种也就是在你方法的某个时机去做什么样的事;
-
织入(Weaving):将通知添加到目标类的具体连接点上的过程;
-
切面(Aspect):切面由切点和通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。
针对通知的话我们又分为5类:
- 前置通知(Before advice)- 在目标方法调用前执行通知
- 后置通知(After advice)- 在目标方法完成后执行通知
- 返回通知(After returning advice)- 在目标方法执行成功后,调用通知
- 异常通知(After throwing advice)- 在目标方法抛出异常后,执行通知
- 环绕通知(Around advice)- 在目标方法调用前后均可执行自定义逻辑
3 AOP核心类
AbstractAutoProxyCreator 是AOP的一个核心类,它实现了SmartInstantiationAwareBeanPostProcessor、BeanFactoryAware 接口,实现了代理创建的逻辑,使用AOP代理包装每个合格的bean,并在调用bean本身之前委派给指定的拦截器。
AbstractAdvisorAutoProxyCreator 通用自动代理创建器,它基于检测每个bean的增强器,为特殊的bean构建AOP代理。子类可以重写此findCandidateAdvisors()方法,以返回适用于任何对象的advisor的自定义列表,子类还可以重写继承的AbstractAutoProxyCreator.shouldSkip()方法,以将某些对象排除在自动代理之外。
AspectJAwareAdvisorAutoProxyCreator 扩展 AbstractAdvisorAutoProxyCreator,公开了AspectJ的调用上下文,并在多个增强器来自同一切面时搞清楚AspectJ的建议优先级顺序。
AspectJAwareAdvisorAutoProxyCreator 还有一个子类叫 AnnotationAwareAspectJAutoProxyCreator,子类AnnotationAwareAspectJAutoProxyCreator是用于处理当前应用程序上下文中的所有AspectJ注解方面以及Spring Advisor。如果Spring AOP的基于代理的模型能够应用任何AspectJ注释的类,它们的advisor将被自动识别,这涵盖了方法执行连接点,Spring Advisor的处理遵循AbstractAdvisorAutoProxyCreator中建立的规则。
AspectJAwareAdvisorAutoProxyCreator 实现了 BeanPostProcessor 等上面介绍的接口,主要作用于Bean初始化前后,实例化前后,所有的Bean都被作用到。InstantiationAwareBeanPostProcessor 是 BeanPostProcessor的子接口,但它的调用时间点发生在Bean实例化前,在真正调用doCreateBean()创建bean实例之前执行postProcessBeforeInstantiation()。
4 小结
掌握了相关AOP的概念,那让我们开始进入源码学习吧。