SpringAOP 底层原理
理解 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);通过上面的注册一个
接下来我们重点看几个重要的类
ProxyFactory
这个就是应用代理技术,Spring
通过
如果被代理类实现了接口,那么底层就会自动使用
jdk 动态代理,生成对应接口类型的代理对象 如果被代理类没有实现接口,那么就选择
cglib 技术 动态代理模式:动态代理类的源码是在程序运行期间通过
JVM 反射等机制动态生成,代理类和委托类的关系是运行时才确定的。
说明链接: 一文搞懂
Advice
五个注解,表示代理逻辑以及执行时机
@Before:接口
MethodBeforeAdvice,继承了接口 BeforeAdvice @AfterReturning:接口
AfterReturningAdvice @AfterThrowing:接口
ThrowsAdvice @After:接口
AfterAdvice @Around:接口
AfterAdvice
Spring
@Before:AspectJMethodBeforeAdvice,实际上就是一个
MethodBeforeAdvice @AfterReturning:AspectJAfterReturningAdvice,实际上就是一个
AfterReturningAdvice @AfterThrowing:AspectJAfterThrowingAdvice,实际上就是一个
MethodInterceptor @After:AspectJAfterAdvice,实际上就是一个
MethodInterceptor @Around:AspectJAroundAdvice,实际上就是一个
MethodInterceptor