SpringAOP底层原理

AOP底层原理解析

Posted by Sunfy on 2021-10-13
Words 940 and Reading Time 3 Minutes
Viewed Times
Viewed Times
Visitors In Total

理解Spring AOP

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

知道了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在运行时

实现方式(动态代理)

站内文章:

web访问:java设计模式之动态代理实现与原理详细分析

文章中介绍了什么是代理模式、常见的代理模式的类型、动态代理的原理、以及在Spring AOP中的应用

我们先回顾下上述文章中说到的Spring AOP在源码中的体现

源码解析

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

image-20210812145750817

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

ProxyFactory

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

image-20211021165948587

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

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

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

Copyright 2021 sunfy.top ALL Rights Reserved

...

...

00:00
00:00