【spring】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)  评论(0编辑  收藏  举报