Advice
拦截器接口:
PointCut
包括一个ClassFilter,用于匹配Class;一个MethodMatcher,用于匹配所调用的参数:
Advisor
包括一个pointcut、一个advice:
生成代理类实例
步骤:
1)将ProxyFactoryBean属性interceptorNames对应的bean转化为Advisor,加入到advisors中;
2)如果ProxyFactoryBean属性singleton为true,则ProxyFactoryBean创建的代理类为单例,否则为prototype类型;
3)获取被代理类实例target;
4)用AopProxyFactory实例(默认为DefaultAopProxyFactory实例)创建AopProxy:如果代理类需要优化或基于类生成代理类或没有提供需要代理的接口即interceptorNames为空,则创建CglibAopProxy,否则创建JdkDynamicAopProxy;
5)利用CglibAopProxy或JdkDynamicAopProxy动态生成代理类实例,JdkDynamicAopProxy是借助Proxy.newProxyInstance生成代理类实例。
拦截机制
步骤:
1)代理类实例的调用会调用JdkDynamicAopProxy invoke方法;
2)获取ProxyFactoryBean中的advisors,对其进行for循环;
3)用advisor的pointcut中的classFilter匹配targetClass,用该advisor的pointcut中的methodMatcher匹配所调用的方法,如都匹配,则获取该advisor对应的methodInterceptors;
4)用代理类实例、被代理类Class、被代理类实例、所调用的方法和参数、匹配的methodInterceptors参数new ReflectiveMethodInvocation实例;
5)调用ReflectiveMethodInvocation实例进行所调用方法的拦截及执行。
参考:
Spring AOP介绍及源码分析:http://www.uml.org.cn/j2ee/201301102.asp