本文共 1847 字,大约阅读时间需要 6 分钟。
IOC篇源码剖析结束(虽然有点烂尾,但这并不影响我们开启AOP源码的剖析)。
AOP的流程大概可以分为三个部分:
1、切面解析 2、代理对象创建 3、目标方法调用与通知
在开始AOP源码的剖析之前,我们需要先做一个前置知识的铺垫。
关于AOP的几个术语,我们还是需要了解一下的。
但是直接看概念很容易傻眼,不信的话你试试-------------
横切关注点(对哪些方法进行切入)
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
切面
类是对物体特征的抽象,切面就是对横切关注点的抽象
连接点(joinpoint)(需要切入的点)
被拦截到的点,因为Spring只支持方法类型的连接点, 所以在Spring中连接点指的就是被拦截到的方法
切入点(pointcut)
对连接点进行拦截的定义
通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码, 通知分为前置、后置、异常、最终、环绕通知五类
目标对象
代理的目标对象
织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
如果你没看傻眼,那当我什么都没说,请直接看第三点。
否则的话我们还是通过实例代码结合图片的形式来分析:
通过这张图片再和上面的概念一对比,是不是清晰很多呢?
而关于织入,我们后面几章要讲的就是这个织入的过程。
关于resolveBeforeInstantiation(……)
方法,在IOC篇的时候有说过它的作用:找到切面和切点并缓存。所以这个方法在AOP流程中是比较重要的。
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { // Make sure bean class is actually resolved at this point. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { Class targetType = determineTargetType(beanName, mbd); if (targetType != null) { bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); } } } mbd.beforeInstantiationResolved = (bean != null); } return bean;}
有了之前接口回调处理的经验,这段代码的逻辑很明显是进行回调处理。
这里千万要注意的是!applyBeanPostProcessorsBeforeInstantiation
和applyBeanPostProcessorsAfterInitialization
的区别可不仅仅是在于Before和After
它们是两个接口:BeanPostProcessor、InstantiationAwareBeanPostProcessor提供的方法,而且它们俩生效的时机是不一样的!
这里比较考验眼力,因为它们长得实在是太像了,先了解一下这两个单词的含义:
一个是实例化,一个是初始化,结合之前IOC流程的理解,Instantiation后缀的接口实现类是在bean实例化阶段进行回调,Initialization后缀的接口实现类则是在bean初始化阶段进行回调即:早期对象和完整对象
除了上述知识,其它知识点我会在分析源码的时候穿插讲解,接下来我们就正式进入spring AOP的源码解析第一站:切面解析。
转载地址:http://dmfmf.baihongyu.com/