springboot 项目通过注解方式实现接口权限校验。 用 aop 和拦截器都可以快速实现,但是这里有个疑惑是:
拦截器是不是全局性质的,所以接口都要过一遍,只是没有检查到注解的我不需要处理而已? 这样会不会导致一丢丢性能的损失相比于 AOP 把切面范围限制的更小。
1
bobuick 2019-12-27 14:16:30 +08:00
虽然可能有些场景用到有重合,因为他们都能支持。
不过拦截器这个是人家 spring 框架的处理流的一环,AOP 跟 Spring 关系不算特别大,虽然你用了 Spring 的 AOP 注解来实现,可是你不用它也是能实现切面编程的。 |
2
bobuick 2019-12-27 14:18:52 +08:00
好像没回答问题,这个看占比,比如要处理的接口几乎 90%,那没区别。如果你的逻辑只处理少量几个接口, 那用你自己定义好范围的 AOP 理论上损失小一些
|
3
qiyuey 2019-12-27 14:25:58 +08:00
取决于你定义的作用范围
|
4
ai277014717 2019-12-27 14:29:04 +08:00
正常来讲你说的 AOP 会涉及到 runtime 所以性能会差一点。拦截器只是对注册的实例有效,理论上编译器更好优化性能更高。
|
5
jaylee4869 2019-12-27 14:31:58 +08:00
拦截器你也可以指定拦截的接口。。
|
6
manami 2019-12-27 14:38:51 +08:00
对比 AOP 拦截器的功能很有限,但能满足一般需求。赞同楼上的“AOP 会涉及到 runtime 所以性能会差一点”,如果要用 AOP,AspectJ 的性能比 Spring AOP 更好更快,但复杂一点。
|
7
chendy 2019-12-27 15:03:35 +08:00
印象里的拦截器不是根据 url 判断是否拦截么,楼主说的根据注解判断的拦截器是什么拦截器?
|
8
lucifer1108 2019-12-27 16:30:50 +08:00
当面试题尝试说一下.
拦截器应该是 web 服务器的行为,注册到 web.xml 的拦截器会根据 URL 匹配过一遍.相当于多一层调用栈.当然,spring 应该是注册了一个统一的 `/*` 的拦截器,我们注入的只是这个拦截器的扩展. aop 是 spring 的行为,是在编译时为符合规则的类动态代理生成新的类.会涉及到动态生成字节码的一些操作.如果有性能的影响也只体现在编译和加载上. 运行时的则完全看你的业务逻辑了. |
9
lihongjie0209 2019-12-27 16:45:52 +08:00
你如果要在所有的 xxxDao 上做动态拦截, 你只能用 AOP
但是你如果想在 xxxController 上做动态拦截, 你可以用拦截器或者是 AOP 如果有的选, 我选拦截器, 代码简单, 逻辑简单, 调试简单 |
10
zhiguang 2019-12-27 18:02:06 +08:00
AOP 不也是代理吗,第一次可能有点影响,后面?
|
11
EXChen 2019-12-28 13:15:39 +08:00
对于 Web 应用,过滤器与拦截器最大的区别在于涉及到转发时拦截器会多次执行,而过滤器只会执行一遍,如果你的请求不涉及到这些其实两者差异不大,使用的技术不同,但都能满足你的需求。
|