看proxyFactory.addAdvice主要干了什么?
看下继承关系:
将advisor加入advisors
看下如何生成代理对象
org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy
org.springframework.aop.framework.DefaultAopProxyFactory#hasNoUserSuppliedProxyInterfaces
如果是接口或者代理类直接返回jdk动态代理
否则返回cglib代理
org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)
看看如何创建代理对象。
org.springframework.aop.framework.ObjenesisCglibAopProxy#createProxyClassAndInstance
真正的创建代理对象的逻辑:
org.springframework.cglib.proxy.Enhancer#createHelper
org.springframework.cglib.core.AbstractClassGenerator#create
看下代理对象执行过程:
org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept
org.springframework.aop.framework.ReflectiveMethodInvocation#proceed
责任链模式,第一次肯定不会相等。
这里会调用我们手写的方法,然后执行processor
再次进来回去执行目标方法
这样就反射到目标方法了,整个流程结束。
1.总结:核心逻辑,重要代码如下:
org.springframework.aop.framework.AdvisedSupport#addAdvice(int, org.aopalliance.aop.Advice)
装饰者模式:advisor包括advice
2.代理对象使用哪种模式,jdk or cglib
org.springframework.aop.framework.ProxyFactory#getProxy()
3.代理对象的产生
org.springframework.aop.framework.CglibAopProxy#getProxy()
org.springframework.aop.framework.CglibAopProxy#createProxyClassAndInstance
org.springframework.cglib.proxy.Enhancer#createHelper
org.springframework.cglib.core.AbstractClassGenerator#create
4.代理对象执行业务逻辑:
org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept
获取所有执行链
org.springframework.aop.framework.AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice
获取拦截器
org.springframework.aop.framework.adapter.DefaultAdvisorAdapterRegistry#getInterceptors
这里有个拦截器 c$1
org.springframework.aop.framework.ReflectiveMethodInvocation#ReflectiveMethodInvocation
构造对象,interceptorsAndDynamicMethodMatchers这个有值了,后续会使用到
org.springframework.aop.framework.ReflectiveMethodInvocation#proceed
第一次肯定不会去执行代理逻辑:
下面回去执行我们写的代理逻辑,然后执行 invocation.proceed();
再次进来就会去反射执行目标方法,目标方法执行完了,整个流程结束