一篇文章从源码层面了解AOP的运作机制!
AOP简单介绍
- 本文源码基于spring-framework-5.3.10。
- AOP表示面向切面编程,是一种编程思想。
AOP中的一些概念
- Aspect:表示切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、Advice等等。
- Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。
- Advice:表示通知,表示在一个特定连接点上所采取的动作。Advice分为不同的类型,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链。
- Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上。
- Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现。
- Target object:目标对象,被代理对象。
- AOP proxy:表示代理工厂,用来创建代理对象的,在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理。
- Weaving:表示织入,表示创建代理对象的动作,这个动作可以发生在编译时期(比如Aspejctj),或者运行时,比如Spring AOP。
Advice在Spring AOP中对应API
- @Before:AspectJMethodBeforeAdvice,实际上就是一个MethodBeforeAdvice。
- @AfterReturning:AspectJAfterReturningAdvice,实际上就是一个AfterReturningAdvice。
- @AfterThrowing:AspectJAfterThrowingAdvice,实际上就是一个MethodInterceptor。
- @After:AspectJAfterAdvice,实际上就是一个MethodInterceptor。
- @Around:AspectJAroundAdvice,实际上就是一个MethodInterceptor。
AOP整体流程
- 实例化前,会判断是否对当前beanName设置了TargetSource,可以通过CustomTargetSourceCreators来设置,如果设置了则直接针对所设置的TargetSource进行AOP,得到代理对象后直接返回,不会经过后续的生命周期了。
- 实例化,得到原始对象。
- 给原始对象填充属性。
- 初始化前。
- 初始化。
- 初始化后,这里会开始进行AOP。
- 先判断当前Bean是不是要进行AOP,比如当前Bean的类型是PointCut、Advice、Advisor等就不需要进行AOP。
- 筛选出和当前Bean所匹配的Advice、Advisor。
- 基本Bean的原始对象和所匹配的Advice、Advisor创建代理对象,并返回。
创建代理对象的流程。
- 构造一个ProxyFactory。
- 配置ProxyFactory。
- 将commonInterceptors和specificInterceptors整合再一起。
生成代理对象流程
- 构造Enhancer对象。
- 设置DynamicAdvisedInterceptor为Callback。
- 所以代理对象执行方法时就会经过DynamicAdvisedInterceptor。
代理对象执行方法的流程
- 根据当前所调用的方法和对应的类筛选对应的Advisor。
- 获取Advisor中的Advice,并封装为MethodInterceptor。
- 将得到的所有匹配的MethodInterceptor组合成List
posted @
2022-03-09 00:37
程序java圈
阅读(
149)
评论()
编辑
收藏
举报