当前位置 : 主页 > 编程语言 > 其它开发 >

深度剖析spring aop原理

来源:互联网 收集:自由互联 发布时间:2022-05-30
1.创建代理对象 在spring中创建bean实例都是从geBean()方法开始的, 在创建实例之后spring容器将会根据AOP的配置去匹配目标类的类名,看目标的类名是否满足切面规则,如果满足切面规

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()方法中执行

 

网友评论