Spring AOP:只拦截public方法的细节与源码解析
需积分: 17 120 浏览量
更新于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应用中集成和管理横切关注点,提高代码的可维护性和可测试性。
3049 浏览量
618 浏览量
126 浏览量
188 浏览量
138 浏览量
129 浏览量
105 浏览量
259 浏览量
2022-11-20 上传
m0_37860504
- 粉丝: 2
- 资源: 1
最新资源
- 蓝桥杯算法辅导.zip
- szOA.Core.rar
- Polopromini.github.io
- 3155-Project:ITCS 3155的小组项目
- piano-lessons-with-greg-kaighin-website
- 自定义滚动条:使用自定义滚动条使Firefox具有个性化效果!
- lengtooyinxiang
- 使用langchain+千问72b+m3e-large+chroma的对话机器人源码python实现
- cqlsh_standalone:独立CQLSH可执行文件
- chapter9 codes_palel6y_撞击_hitormishit_
- algo-green-bond
- pdksh-5.2.14-36.el5.i386.rpm
- IN3170:2021年Spring在Corse IN3170上的文件
- TP_SIR_mongodb
- whois:智能的纯Ruby WHOIS客户端和解析器
- SoyHuCe-technical-test