- @EnableAspectJAutoProxy会给容器注册一个AnnotationAwareAspectJAutoProxyCreator组件,而该组件是一个后置处理器BeanPostProcessor;
- 在spring容器初始化的时候会执行registerBeanPostProcessor()方法,注册所有的后置处理器,包括AnnotationAwareAspectJAutoProxyCreator;
- 在之后的容器初始化过程中,会执行finishBeanFactoryInitialization()方法,该方法会创建所有的单实例bean,而创建过程中后置处理器会对创建过程进行拦截;
- AnnotationAwareAspectJAutoProxyCreator的postProcessorAfterInstantial()方法会判断是否需要对组件进行增强
- 需要,则将通知方法封装成增强器
- 给业务逻辑组件创建一个代理对象
- 得到代理对象后,执行代理对象的目标方法
- 将目标方法的增强器封装成拦截器,得到代理对象的拦截器链
- 链式调用拦截器链
- 执行的效果就是:
- 正常执行:前置通知->目标方法->后置通知->返回通知
- 异常执行:前置通知->目标方法->后置通知->异常通知
总结:aop的核心就是给容器中注册了AnnotationAwareAspectJAutoProxyCreator组件,该组件是一个后置处理器,后置处理器会在bean创建的时候进行一些处理,而这个后置处理器的处理就是将通知方法封装成增强器并创建目标对象的代理对象;代理对象创建完成之后的执行过程就是将增强器包装成拦截器链,采用链式调用的方式执行增强方法和目标方法,达到aop的效果。
这里只是简单理一下aop的底层原理,具体的源码论证以后有时间再贴了。。。