1.创建代理对象
在spring中创建bean实例都是从geBean()方法开始的,
在创建实例之后spring容器将会根据AOP的配置去匹配目标类的类名,看目标的类名是否满足切面规则,如果满足切面规则就会调用ProxyFactory去创建Bean,并且缓存到IOC容器中
然后根据目标对象自动选择不同的代理策略,如果目标类实现了接口,spring会默认实现JDK Proxy,如果目标类没有实现接口,Spring会默认选择Cglib Proxy
当然我们也可以通过配置强制使用Cglib Proxy
2.拦截目标对象
当用户调用对象目标的某个方法的时候,将会被一个叫做AOP Proxy的对象拦截,
Spring将所有的调用策略封装到了这个对象中,它默认实现了一个叫做InvocationHandler的接口,也就是调用代理对象的外层拦截器,在这个接口的invoke()方法中,
会触发MethodInvocation的proceed()方法,在proceed()方法中,会按顺序执行符合所有aop规则的拦截器链
3.调用代理对象
Spring Aop拦截器链中每个元素都会被命名为MethodInterceptor
其实也就是切面中的Advice通知,这个通知是可以用来回调,可以简单地理解成就是生成的代理Bean的方法,也就是我们常说的被织入的代码片段,这些被织入的代码片段会在这个阶段被执行
4.调用目标对象
MethodInterceptor,也有一个invoke()方法,在MethodInterceptor的invoke()方法中会触发对目标对象的调用,也就是去反射调用目标对象的方法
代理对象:由spring代理策略生成的对象
目标对象:我们自己写的业务代码
织入代码:在我们自己写的业务代码增加的代码片段
切面通知:封装织入代码片段的回调方法
MethodInvocation:负责执行拦截器链,在proceed()方法中执行
MethodInterceptor:负责执行织入的代码片段,在invoke()方法中执行