1、Spring AOP拦截器
(1)设计原理
Spring AOP在通过JDK的Proxy或者CGLIB方式生成代理对象的时候,拦截器的相关信息就配置到代理对象中了。
1)如果使用JDK的Proxy方式生成的代理对象,需要通过InvocationHandler方法来设置拦截器回调。
Proxy代理对象调用:proxy.NewProxyInstance(classloader,proiedInterfaces,this);其中this就是InvocationHandler,InvocationHandler是JDK定义的反射类的接口。
2)如果使用CGLIB方式生成的代理对象,需要通过DynamicAdvisedInterceptor完成回调
DynamicAdvisedInterceptor方法实现在intercept方法中,intercept回调方法和InvocationHandler回调的方式基本一样,只是在CGLIB2AOPProxy中构造CglibMethodINvocation对象来完成拦截器链的调用,而在JdkDynamicAOPProxy中是通过构造ReflectiveMethodInvocation对象来完成的。
3)目标方法的调用
JDKDynamicAopProxy代理对象的方法调用通过AopUntils使用反射机制在AopUntils.InvokeJoinpointUsingReflection的方法中实现的。首先得到调用方法的反射对象,然后使用invoke启动对方法反射对象的调用。
4)AOP拦截器链的调用
对拦截器链调用都是在ReflectiveMethodInvocation中通过proceed方法中实现的,在方法中,回逐个运行拦截器的拦截方法。