寻找入口
Spring 的 AOP 是通过接入 BeanPostProcessor 后置处理器开始的,它是 Spring IOC 容器经常使用到 的一个特性,这个 Bean 后置处理器是一个监听器,可以监听容器触发的 Bean 声明周期事件.
BeanPostProcessor 后置处理器的调用发生在 Spring IOC 容器完成对 Bean 实例对象的创建和属性的 依赖注入完成之后
在 AbstractAutowireCapableBeanFactory 类中initializeBean()方法为容器产生的 Bean 实例对象添加 BeanPostProcessor 后置处理器
选择代理策略
AbstractAutoProxyCreator 类。该类重写了 postProcessAfterInitialization()方法调到了一个非常核心的方法 wrapIfNecessary(),
发现最终调用的是 proxyFactory.getProxy()方法.到这里我们大概能够猜到 proxyFactory 有 JDK 和 CGLib 的,那么我们该如何选择呢?最终调用的是 DefaultAopProxyFactory 的 createAopProxy()方法:
调用代理方法
从 JdkDynamicAopProxy 的源码我们可以看到这个类其实也实 现了 InvocationHandle。首先获取应用到此方法上的通知链(Interceptor Chain)。如果有通知,则 应用通知,并执行 JoinPoint;如果没有通知,则直接反射执行 JoinPoint。而这里的关键是通知链是如 何获取的以及它又是如何执行的呢?现在来逐一分析。首先,从上面的代码可以看到,通知链是通过 Advised.getInterceptorsAndDynamicInterceptionAdvice()这个方法来获取的
触发通知
在为 AopProxy 代理对象配置拦截器的实现中,有一个取得拦截器的配置过程,这个过 程是由 DefaultAdvisorChainFactory 实现的,这个工厂类负责生成拦截器链,在它的 getInterceptorsAndDynamicInterceptionAdvice 方法中,有一个适配器和注册过程, 通过配置 Spring 预先设计好的拦截器,Spring 加入了它对 AOP 实现的处理