V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
beryl
V2EX  ›  程序员

Java 拦截器和 AOP 差异及性能

  •  1
     
  •   beryl · 2019-12-27 14:07:58 +08:00 · 5472 次点击
    这是一个创建于 1575 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    如果有的选, 我选拦截器, 代码简单, 逻辑简单, 调试简单
    zhiguang
        10
    zhiguang  
       2019-12-27 18:02:06 +08:00
    AOP 不也是代理吗,第一次可能有点影响,后面?
    EXChen
        11
    EXChen  
       2019-12-28 13:15:39 +08:00
    对于 Web 应用,过滤器与拦截器最大的区别在于涉及到转发时拦截器会多次执行,而过滤器只会执行一遍,如果你的请求不涉及到这些其实两者差异不大,使用的技术不同,但都能满足你的需求。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4712 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 09:59 · PVG 17:59 · LAX 02:59 · JFK 05:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.