ProxyFactoryBean 的getObject方法作为入口 有两个任务 第一个是获得它的通知 并初始化适配 注册成为拦截器链 具体的配置内容在Config AdviceSupport类中 类通过实现了setBeanFactory方法获得了IOC容器的回调 从而可以使用IOC容器 并拥有Advice的配置信息 根据配置信息 name向IOC容器中getbean()方法 获得了advice对象 然后交给一个注册类 注册类中有各种适配类 adapt 会适配具体的advice属于哪一种 有MethodBefore AfterRurning 等等 适配合适的advice后交给Interceptor封装起来 Interceptor的invoke()方法会触发拦截器的调用 如果是MethodBefore会先去调用advice方法 在执行proceed()方法 然后交给其注册类注册 维护一个List 也就是拦截器的List
接下来是Proxy对象的生成 Proxy对象根据目标方法是否实现了接口 如果实现了接口就使用 动态代理生成 如果没有 就使用CGLIB生成 那个JDKDynamicProxy 类实现了InvokeHandle接口 所以重写了invoke方法 invoke方法中 如果调用了代理类的相关方法 就会跳转到invoke去执行 invoke方法中 先去获得初始化好的拦截器链 用责任链模式去执行 执行完拦截器链 最后执行目标方法 也就是invoke方法中做到了通知的织入和增强
AOP还有高级配置 也就是HotSwappableTargetSource 这个类的swap方法以线程安全的方式 替换了target类 也就是实现了运行时不影响拦截器的情况下做到替换target 实现热交换 目标方法 最后invoke方法中获得target的是交换后的方法