Spring AOP是通过动态代理实现的,它在运行时通过生成代理对象来拦截和增强目标方法的执行。
具体运行流程如下:
1. 定义切面:使用Spring的AOP注解(如@Aspect)定义切面类,标识切面的切点和通知。
2. 创建目标对象:创建需要被增强的目标对象,该对象通常是一个普通的Spring bean。
3. 创建AOP代理:当Spring容器初始化时,它会扫描并检测切面类,并为目标对象创建AOP代理。Spring提供两种代理方式:JDK动态代理和CGLIB动态代理。
4. 选择代理方式:如果目标对象实现了接口,则使用JDK动态代理;如果目标对象没有实现接口,则使用CGLIB动态代理。
5. 生成代理对象:根据选择的代理方式,Spring会生成一个代理对象,该对象实现了目标对象所实现的接口或者继承了目标对象的类。
6. 执行目标方法:当调用代理对象的方法时,AOP代理会拦截对目标方法的调用,并根据切点和通知的定义来执行相应的增强逻辑。
7. 执行通知:根据切点的定义,AOP代理会在目标方法的不同位置(如方法调用前、方法调用后、方法返回时等)执行相应的通知逻辑。
通过上述流程,Spring AOP能够在运行时动态地将切面逻辑织入到目标方法中,实现对目标方法的拦截和增强。这种方式使得切面逻辑与核心业务逻辑解耦,提供了更好的可维护性和灵活性。
需要注意的是,Spring AOP只能拦截被Spring容器管理的Bean的方法调用。对于在容器外部创建的对象或者静态方法调用,Spring AOP是无法拦截的。