什么是AOP?
AOP是一种编程范式,用于在不修改原始代码的情况下向现有应用程序添加新功能。这种编程方式将应用程序分成许多独立的部分,称为切面。这些切面可以在应用程序的不同位置进行编写和维护,从而提高了应用程序的可重用性和可维护性。
AOP主要用于实现横切关注点(Cross-Cutting Concerns),例如日志记录、性能监测、事务管理等。通过AOP,我们可以将这些关注点与应用程序的其他部分分离开来,从而使应用程序更加模块化和易于维护。
实现原理
Spring AOP 的实现原理是基于动态代理和字节码操作的。
在编译时, Spring 会使用 AspectJ 编译器将切面代码编译成字节码文件。在运行时, Spring 会使用 Java 动态代理或 CGLIB 代理生成代理类,这些代理类会在目标对象方法执行前后插入切面代码,从而实现AOP的功能。
Spring AOP 可以使用两种代理方式:JDK动态代理和 CGLIB 代理。如果目标对象实现了至少一个接口,则使用JDK动态代理;否则,使用 CGLIB 代理。下面分别介绍这两种代理方式的实现原理。
JDK动态代理
JDK 动态代理是 Java 自带的动态代理实现方式。使用JDK动态代理时,需要目标对象实现至少一个接口。JDK 动态代理会在运行时生成一个实现了目标对象接口的代理类,该代理类会在目标对象方法执行前后插入切面代码。
AOP使用示例
在了解了 Spring AOP的实现原理后,我们来看一下 Spring AOP的源码实现。Spring AOP的源码位于org.Springframework.aop包下,其中涉及到的类有:
Advised:一个包含切面信息的接口,用于描述切面的配置信息。
AdvisedSupport:Advised接口的默认实现类,包含了切面的配置信息。
AopProxy:AOP代理的接口,用于获取代理对象。
CglibAopProxy: CGLIB 代理的实现类。
JdkDynamicAopProxy:JDK动态代理的实现类。
MethodInvocation:方法调用的接口,用于封装目标对象方法的调用过程。
ReflectiveMethodInvocation:MethodInvocation接口的默认实现类,用于调用目标对象方法。
MethodInterceptor:方法拦截器的接口,用于实现切面的具体逻辑。
ProxyFactory:代理工厂,用于创建代理对象。