Spring AOP:只拦截public方法的细节与源码解析

需积分: 17 0 下载量 34 浏览量 更新于2024-09-07 收藏 28KB DOCX 举报
在深入理解Java Spring框架中的Aspect-Oriented Programming (AOP)时,需要注意一些关键点。Spring AOP默认行为是只拦截公共方法(public),而对于保护访问权限的方法(protected)和私有方法(private)则不进行拦截。这与Spring的代理机制有关,它创建的代理对象仅针对代理对象自身的公开方法执行切面逻辑,而不会干预其内部调用的私有方法。 例如,考虑一个简单的类`B`,它有两个公开方法`foo1()`和`foo2()`,其中`foo1()`内部调用了`foo2()`。如果我们尝试对这两个方法进行AOP处理,那么当我们直接通过`B`对象调用`foo1()`时,只会拦截`foo1()`本身,`foo2()`的执行不会受到影响。这是因为Spring的代理行为仅限于代理对象的接口,而`this.foo2()`这样的内部调用并未通过代理对象进行。 Spring源码层面,对于是否执行拦截的判断基于`this`引用的类型。如果是`B`类的实例,那么无论调用哪个方法都不会触发AOP代理。但如果是通过代理对象`bProxy`调用,比如`bProxy.foo1()`,则会触发预先设置的回调函数(如`intercept()`方法)。在这个方法中,会检查代理上下文(`setProxyContext`)和目标对象(`target`)等信息,然后执行相应的切面逻辑,包括可能的前置通知、后置通知、环绕通知等。 值得注意的是,为了确保代理对象的行为符合预期,开发者需要了解如何正确配置切面(advised)和通知(advice),包括何时暴露代理(`exposeProxy`)以及何时在代理对象生命周期中执行切面。同时,理解Spring AOP的底层实现,如CGLIB或JDK动态代理,有助于我们更好地利用AOP进行代码结构优化和业务逻辑分离。 总结来说,Spring AOP的使用需要注意方法访问权限的影响,正确配置代理行为,以及理解回调函数的执行流程。掌握这些要点,可以更有效地在Spring应用中集成和管理横切关注点,提高代码的可维护性和可测试性。