探索Spring5 AOP执行流程与代理机制
2023-09-03 21:30:27
Spring AOP代理的创建
在Spring AOP中,代理的创建主要由AopProxyFactory类负责。AopProxyFactory是一个抽象类,它提供了创建代理的通用方法。在Spring中,有两种代理类型:JDK动态代理和CGLIB动态代理。JDK动态代理使用java.lang.reflect.Proxy类创建代理,而CGLIB动态代理使用CGLIB库创建代理。
JDK动态代理
JDK动态代理是基于Java反射机制实现的。它通过创建一个实现了InvocationHandler接口的类来创建代理。InvocationHandler接口定义了一个invoke方法,该方法会在代理对象的方法被调用时执行。在Spring中,JdkDynamicAopProxy类实现了InvocationHandler接口。JdkDynamicAopProxy类在invoke方法中会调用目标方法,并在目标方法执行前后执行AOP拦截器链中的Advice。
CGLIB动态代理
CGLIB动态代理是基于CGLIB库实现的。CGLIB库是一个开源的代码生成库,它可以动态地生成Java类。在Spring中,CglibAopProxy类实现了CGLIB库中的Enhancer类。CglibAopProxy类在Enhancer类的帮助下可以动态地生成一个继承自目标类的子类,并在这个子类中重写目标方法,在重写的方法中执行AOP拦截器链中的Advice。
目标方法的执行过程
当我们通过代理对象调用目标方法时,实际上是代理对象调用了InvocationHandler接口的invoke方法。在invoke方法中,代理对象会调用目标方法,并在目标方法执行前后执行AOP拦截器链中的Advice。
AOP拦截器链
AOP拦截器链是一个有序的拦截器列表。每个拦截器都实现了一个Advice接口。Advice接口定义了一个before、after、afterReturning和afterThrowing方法。这四个方法分别会在目标方法执行前、执行后、执行后正常返回时和执行后抛出异常时执行。
JoinPoint
JoinPoint是一个接口,它表示一个方法执行的连接点。JoinPoint接口提供了获取方法签名、方法参数、目标对象和目标类等信息的方法。
Advice
Advice是一个接口,它定义了在JoinPoint上执行的代码。Advice接口有四种实现:BeforeAdvice、AfterAdvice、AfterReturningAdvice和AfterThrowingAdvice。这四种Advice分别对应于在目标方法执行前、执行后、执行后正常返回时和执行后抛出异常时执行的代码。
Spring AOP的应用场景
Spring AOP可以用于实现各种横切关注点,比如日志记录、安全、缓存、事务管理等。Spring AOP通过将横切关注点从业务代码中分离出来,使业务代码更加简洁和易于维护。
结语
Spring AOP是一个非常强大的功能,它可以帮助我们轻松地实现各种横切关注点。Spring AOP的实现原理并不复杂,但它却可以为我们带来巨大的收益。如果你想深入理解Spring AOP的实现原理,那么本文将是一个很好的起点。