Spring AOP(Aspect-Oriented Programming)是 Spring 框架的一个重要特性,它主要用于在不修改原有代码的情况下,为应用程序添加横切关注点的功能。Spring AOP 通过切面(Aspect)来描述横切关注点,然后通过代理技术将切面织入到应用程序的目标对象中,从而实现横切关注点的功能增强。
对于同一个类中的方法调用,Spring AOP 并不会触发拦截器。这是因为 Spring AOP 使用的是 JDK 动态代理或者 CGLIB 字节码增强技术,在代理对象中实现了目标方法的拦截和增强。当应用程序调用目标对象的方法时,实际上是调用了代理对象的方法,代理对象通过反射机制调用目标对象的方法,并在调用前后执行了切面逻辑。
如果同一个类中的方法调用也触发拦截器,那么就会陷入死循环。因为当应用程序调用一个目标对象的方法时,实际上是通过代理对象调用的,代理对象会在调用前后执行切面逻辑。如果这个目标对象的方法中调用了同一个类中的其他方法,那么代理对象就会再次调用这个目标对象的方法,然后再次触发拦截器,就会一直循环下去,直到发生栈溢出异常。
为了避免这种死循环的情况,Spring AOP 只对目标对象的方法进行拦截和增强,而不对目标对象内部方法的调用进行拦截。如果需要在同一个类中的方法之间实现拦截和增强,可以考虑使用 AspectJ 来实现,因为 AspectJ 是在编译期或者加载期织入切面的,可以对同一个类中的方法调用进行拦截和增强。