SpringAOP底层原理

理解Spring AOP


提到AOP那我们自然会想到初学java时经常提到的OOP,OOP表示的是面向对象编程,是一种编程思想。AOP则是面向切面编程,同样也是一种编程思想。从Spring作为一个框架的角度来说,提供了一整套的面向切面编程的机制,让我们更容易进行开发,这套机制在Spring中就称为Spring AOP。

AOP :将程序中的交叉业务(日志、安全、事务等),封装成一个切面,然后注入到目标对象的具体逻辑中去。AOP可以对某个对象或某些对象的功能进行增强,具体来说,对某个对象的方法进行增强,可以在执行方法之余额外做一些事情,可以在方法前、方法后等。

Spring AOP中的概念


  • Aspect:切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、advice等等

  • Join point:连接点,表示一个程序在执行过程中的一个点,比如一个方法的运行,比如一个异常的处理。在Spring AOP中,一个连接点通常表示一个方法的执行。

  • Advice:通知,表示在一个特定连接点上所采取的动作。

  • Pointcut:切点,用来匹配一个或多个连接点,Advice与切点表达式时关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上

  • Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现

  • Target object:目标对象,被代理对象

  • AOP proxy:代理工厂,用来创建代理对象的。在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理

  • Weaving:织入,表示创建代理对象的动作,这个动作Aspejctij发生在编译时期,Spring AOP在运行时

实现方式(动态代理)


源码解析

Spring AOP 解析切面源码入口 @EnableAspectJAutoProxy —> AspectJAutoProxyRegistrar —>AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);通过上面的注册一个Bean定义 AnnotationAwareAspectJAutoProxyCreator.class查看注册的bean的结构,可以知道注册的是一个bean的后置处理器;此处就是ioc的一个扩展点。

upload successful

接下来我们重点看几个重要的类

ProxyFactory

这个就是应用代理技术,Spring经过封装后,生成的代理工厂类,会由它来负责创建具体的代理类。

upload successful

通过ProxyFactory,我们在使用过程中不需要去关注到底使用cglib,还是jdk动态代理,Spring实现的PorxyFactory会帮助我们去判断通过何种方式生成代理类

  • 如果被代理类实现了接口,那么底层就会自动使用jdk动态代理,生成对应接口类型的代理对象

  • 如果被代理类没有实现接口,那么就选择cglib技术

  • 动态代理模式:动态代理类的源码是在程序运行期间通过JVM反射等机制动态生成,代理类和委托类的关系是运行时才确定的。

说明链接一文搞懂Spring AOP原理,面试不再怕的!

Advice

五个注解,表示代理逻辑以及执行时机

  • @Before:接口MethodBeforeAdvice,继承了接口BeforeAdvice

  • @AfterReturning:接口AfterReturningAdvice

  • @AfterThrowing:接口ThrowsAdvice

  • @After:接口AfterAdvice

  • @Around:接口AfterAdvice

Spring会把五个注解解析为对应的Advice类:

  • @Before:AspectJMethodBeforeAdvice,实际上就是一个MethodBeforeAdvice

  • @AfterReturning:AspectJAfterReturningAdvice,实际上就是一个AfterReturningAdvice

  • @AfterThrowing:AspectJAfterThrowingAdvice,实际上就是一个MethodInterceptor

  • @After:AspectJAfterAdvice,实际上就是一个MethodInterceptor

  • @Around:AspectJAroundAdvice,实际上就是一个MethodInterceptor


SpringAOP底层原理
http://ysocket.pages.dev/2022/12/14/spring-aop-01/
作者
YSocket
发布于
20221214
许可协议