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

关于 aop 记录日志的一个问题

  •  
  •   MadDoggy · 2021-06-02 10:46:40 +08:00 · 2325 次点击
    这是一个创建于 1030 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 希望通过 aop 在接口被调用时打印日志
    • 现在有两个模块,一个 common,一个 business,切面类写在 common 模块下,execution 表达式匹配的是 business 下的 controller ;现在的问题是 common 是不应该依赖 business 的,这导致 execution 表达式匹配不到 business 下的 controller,我应该把这个切面类移到 business 下吗,这样的话有多个业务模块得重写多次切面类吗
    18 条回复    2021-06-03 13:43:49 +08:00
    ingdawn
        1
    ingdawn  
       2021-06-02 10:48:55 +08:00
    business 不依赖 common ?
    MadDoggy
        2
    MadDoggy  
    OP
       2021-06-02 10:52:24 +08:00
    @ingdawn business 是依赖 common 的,但是 execution 表达式无法匹配到 business 下的 controller
    MadDoggy
        3
    MadDoggy  
    OP
       2021-06-02 11:04:34 +08:00
    背景是我在参考这个开源项目 https://github.com/macrozheng/mall 导入 idea 后他的切面类中的表达式是无法识别的,我仿照他的结构和方式写,接口被调用时也是无法进到这个切面类的
    limuyan44
        4
    limuyan44  
       2021-06-02 11:26:42 +08:00
    你需要的是 spring.factories 。
    limuyan44
        5
    limuyan44  
       2021-06-02 11:27:56 +08:00
    对于 spring 的公共日志模块算是一个经典的用法。
    MadDoggy
        6
    MadDoggy  
    OP
       2021-06-02 11:40:11 +08:00
    @limuyan44 嗯我会去了解的,目前还是想把这个问题搞清楚
    xuanbg
        7
    xuanbg  
       2021-06-02 13:45:45 +08:00
    不是在拦截器里面打日志就好了吗???
    ayang11
        8
    ayang11  
       2021-06-02 14:21:13 +08:00
    或许可以写个自定义注解 给所有需要打日志的接口都加上注解 然后 aop 监听注解
    clf
        9
    clf  
       2021-06-02 14:27:41 +08:00
    api 请求的日志还是用 filter 来处理。对特定注解(或接口实现类)再考虑用 AOP 。
    huifer
        10
    huifer  
       2021-06-02 16:16:05 +08:00
    可以尝试手动注入切面,通过 bean 方式
    chenshun00
        11
    chenshun00  
       2021-06-02 19:05:03 +08:00
    不需要的,最后 common 不还是和 business 达成一个 war 包或者是 jar 包运行么,就算不和 business 放一起,最多也是没有匹配到,不过 idea 会再 common 提示匹配不到,这是因为 idea 作为 IDE 做了优化,脱离 idea 来看,引入记事本来看,其实 common 里边的切面和表达式只不过是字符串,不影响的,最终也是在运行时生效
    MadDoggy
        12
    MadDoggy  
    OP
       2021-06-02 19:13:58 +08:00
    @chenshun00 但是实际上运行的时候,接口被调用的时候也没有进入切面,就很奇怪
    limuyan44
        13
    limuyan44  
       2021-06-02 19:37:12 +08:00
    既然你没写过 spring.factories 大概率你没配要么你没配好 scanBasePackages 把要扫描的包放进去,上面多数是瞎说,其他包的 bean 你不手动去配置扫描怎么可能自动执行。
    ychost
        14
    ychost  
       2021-06-02 20:27:20 +08:00
    common 不应该管控到 business 里面,应该仅提供日志打印能力,在 business 里面写好 aop 引用日志模块
    chenshun00
        15
    chenshun00  
       2021-06-02 20:38:33 +08:00
    @MadDoggy 大概率是切面没有被扫描
    seliote
        16
    seliote  
       2021-06-02 23:14:22 +08:00
    应该是切点写的不对, 或者 Common 里的 AOP 没有被扫描到, 模块和切不切没有必然关系
    zifangsky
        17
    zifangsky  
       2021-06-03 11:26:02 +08:00
    通过自定义注解,AOP 扫描有指定注解的方法,然后再记录日志。给你一个例子: https://github.com/zifangsky/quick-modules-example/blob/master/src/main/java/cn/zifangsky/quickmodules/example/config/QuickLogModuleConfig.java
    ikas
        18
    ikas  
       2021-06-03 13:43:49 +08:00
    你这明显是切面配置不对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1246 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:25 · PVG 07:25 · LAX 16:25 · JFK 19:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.