Java 拦截器和 AOP 差异及性能

2019-12-27 14:07:58 +08:00
 beryl

springboot 项目通过注解方式实现接口权限校验。 用 aop 和拦截器都可以快速实现,但是这里有个疑惑是:

拦截器是不是全局性质的,所以接口都要过一遍,只是没有检查到注解的我不需要处理而已? 这样会不会导致一丢丢性能的损失相比于 AOP 把切面范围限制的更小。

5481 次点击
所在节点    程序员
11 条回复
bobuick
2019-12-27 14:16:30 +08:00
虽然可能有些场景用到有重合,因为他们都能支持。
不过拦截器这个是人家 spring 框架的处理流的一环,AOP 跟 Spring 关系不算特别大,虽然你用了 Spring 的 AOP 注解来实现,可是你不用它也是能实现切面编程的。
bobuick
2019-12-27 14:18:52 +08:00
好像没回答问题,这个看占比,比如要处理的接口几乎 90%,那没区别。如果你的逻辑只处理少量几个接口, 那用你自己定义好范围的 AOP 理论上损失小一些
qiyuey
2019-12-27 14:25:58 +08:00
取决于你定义的作用范围
ai277014717
2019-12-27 14:29:04 +08:00
正常来讲你说的 AOP 会涉及到 runtime 所以性能会差一点。拦截器只是对注册的实例有效,理论上编译器更好优化性能更高。
jaylee4869
2019-12-27 14:31:58 +08:00
拦截器你也可以指定拦截的接口。。
manami
2019-12-27 14:38:51 +08:00
对比 AOP 拦截器的功能很有限,但能满足一般需求。赞同楼上的“AOP 会涉及到 runtime 所以性能会差一点”,如果要用 AOP,AspectJ 的性能比 Spring AOP 更好更快,但复杂一点。
chendy
2019-12-27 15:03:35 +08:00
印象里的拦截器不是根据 url 判断是否拦截么,楼主说的根据注解判断的拦截器是什么拦截器?
lucifer1108
2019-12-27 16:30:50 +08:00
当面试题尝试说一下.
拦截器应该是 web 服务器的行为,注册到 web.xml 的拦截器会根据 URL 匹配过一遍.相当于多一层调用栈.当然,spring 应该是注册了一个统一的 `/*` 的拦截器,我们注入的只是这个拦截器的扩展.
aop 是 spring 的行为,是在编译时为符合规则的类动态代理生成新的类.会涉及到动态生成字节码的一些操作.如果有性能的影响也只体现在编译和加载上.
运行时的则完全看你的业务逻辑了.
lihongjie0209
2019-12-27 16:45:52 +08:00
你如果要在所有的 xxxDao 上做动态拦截, 你只能用 AOP

但是你如果想在 xxxController 上做动态拦截, 你可以用拦截器或者是 AOP

如果有的选, 我选拦截器, 代码简单, 逻辑简单, 调试简单
zhiguang
2019-12-27 18:02:06 +08:00
AOP 不也是代理吗,第一次可能有点影响,后面?
EXChen
2019-12-28 13:15:39 +08:00
对于 Web 应用,过滤器与拦截器最大的区别在于涉及到转发时拦截器会多次执行,而过滤器只会执行一遍,如果你的请求不涉及到这些其实两者差异不大,使用的技术不同,但都能满足你的需求。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632868

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX