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

求大佬指教这个 spring aop 的切点表达式怎么写

  •  
  •   fpure · 2021-04-27 23:00:09 +08:00 · 2698 次点击
    这是一个创建于 1330 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个类,类里面的某个方法上有一个自定义注解,现在我想用 aop 拦截这个类的所有方法,可以实现吗?如果能实现这个切点表达式该怎么写呢?

    31 条回复    2021-04-28 21:38:17 +08:00
    cjlmwcy
        1
    cjlmwcy  
       2021-04-27 23:10:07 +08:00
    @within(package.path.ClassName)
    cjlmwcy
        2
    cjlmwcy  
       2021-04-27 23:10:47 +08:00
    package.path.ClassName 是你自定义注解的全路径
    gengzi
        3
    gengzi  
       2021-04-27 23:11:25 +08:00
    可以,可以直接扫这个注解 ,网上有很多示例,可以百度下
    @Pointcut("@annotation(注解的包名.类名)")
    fpure
        4
    fpure  
    OP
       2021-04-27 23:28:15 +08:00
    @cjlmwcy 不行的,within 定义的是修饰类的注解,我这个注解是修饰在方法上面的
    fpure
        5
    fpure  
    OP
       2021-04-27 23:29:36 +08:00
    @gengzi 也不行,annotation 定义的拦截被注解修饰的方法,没被修饰的方法是不会拦截的
    sqmwin
        6
    sqmwin  
       2021-04-28 00:01:00 +08:00
    一定要这样做吗?目的是什么
    caixiaomao
        7
    caixiaomao  
       2021-04-28 08:24:19 +08:00
    @Pointcut("execution(* com.github.controller.xxclass.*(..))")
    gitdoit
        8
    gitdoit  
       2021-04-28 08:54:22 +08:00
    自带的满足不了需求的话,spring 应该留了扩展,可以查一下
    fpure
        9
    fpure  
    OP
       2021-04-28 09:11:37 +08:00
    @sqmwin 我需要在系统启动之后一段时间需要执行一个任务,我想把执行这个任务的时间点放在用户对这个类做任何操作之前;这样的话我就想用 aop 来实现这个功能,否则我就要在每个方法前都加上某段初始化逻辑;我也不想为了实现这个功能定义俩个注解,类上一个方法上一个
    Kasumi20
        10
    Kasumi20  
       2021-04-28 09:18:44 +08:00
    你用的是加载时编织吗?
    fpure
        11
    fpure  
    OP
       2021-04-28 09:25:25 +08:00
    @Kasumi20 我直接就是用的 @Pointcut 注解,这个应该是加载时编织吧
    Kasumi20
        12
    Kasumi20  
       2021-04-28 09:28:26 +08:00
    execution(* *()) && @annotation(Fuck)

    亲测可以
    Kasumi20
        13
    Kasumi20  
       2021-04-28 09:29:39 +08:00
    你这是运行时编织,这个类必须是 @Component 注解的 Bean
    fpure
        14
    fpure  
    OP
       2021-04-28 09:42:26 +08:00
    @Kasumi20 不行啊,这个还是只能拦截加了注解的方法,不能拦截类中没有加注解的方法
    Kasumi20
        15
    Kasumi20  
       2021-04-28 09:43:56 +08:00
    @fpure 加一个注解也不累啊,总比加代码好
    xiaoxinshiwo
        16
    xiaoxinshiwo  
       2021-04-28 09:47:11 +08:00
    懂你的描述了,好麻烦啊,可否将自定义注解加在类上啊
    fpure
        17
    fpure  
    OP
       2021-04-28 09:47:34 +08:00
    @Kasumi20 好吧,我打算换思路了,我试试在 spring boot 中怎么延迟执行任务
    Xhack
        18
    Xhack  
       2021-04-28 09:50:48 +08:00
    execution(访问权限符 返回值类型 方法全类名(参数表))
    liudaolunhuibl
        19
    liudaolunhuibl  
       2021-04-28 09:51:36 +08:00
    做不到的吧,只能切这个方法,或者你把注解写在类上
    fpure
        20
    fpure  
    OP
       2021-04-28 09:54:25 +08:00
    @xiaoxinshiwo 我对 spring aop 的期望太理想化了,我简直无法理解 pointcut 函数存在的目的仅仅是为了定义一个切点表达式,哪怕是用这个函数判断那些类和函数可不可以被拦截也好啊
    xiaoxinshiwo
        21
    xiaoxinshiwo  
       2021-04-28 09:57:40 +08:00
    @fpure 异步事件就能搞定哦
    fpure
        22
    fpure  
    OP
       2021-04-28 10:02:51 +08:00
    @xiaoxinshiwo 我这个程序是 1+n 的架构,1 端启动之后通知 n 端注册,所以我并不知道 n 端什么时候全部注册成功,而我要执行的任务依赖 n 端注册,所以我只能延迟执行+定时执行这个任务
    xiaoxinshiwo
        23
    xiaoxinshiwo  
       2021-04-28 10:04:22 +08:00
    @fpure 可以发消息,接收到 N+1 个注册完成的消息再执行任务
    fpure
        24
    fpure  
    OP
       2021-04-28 10:05:48 +08:00
    @xiaoxinshiwo 我并不知道有多少个 n 端
    xiaoxinshiwo
        25
    xiaoxinshiwo  
       2021-04-28 10:06:55 +08:00
    @fpure 好吧
    fpure
        26
    fpure  
    OP
       2021-04-28 10:19:37 +08:00
    @xiaoxinshiwo 找到了 Executors.newSingleThreadScheduledExecutor().schedule(command, delay, unit)是我想要的
    xiaoxinshiwo
        27
    xiaoxinshiwo  
       2021-04-28 10:21:15 +08:00
    @fpure 我去学习下
    xiaoxinshiwo
        28
    xiaoxinshiwo  
       2021-04-28 10:22:00 +08:00
    @fpure 不过你这个延迟多久呢?怎么计算的?
    fpure
        29
    fpure  
    OP
       2021-04-28 10:38:13 +08:00
    @xiaoxinshiwo 不用计算,因为无法知道 n 端是否全部注册,所以我这里直接延迟一段时间,然后再用定时去刷就行了
    shanghai1943
        30
    shanghai1943  
       2021-04-28 16:25:01 +08:00
    不知道你的具体业务场景,可否换个思路解决呢。比如去做注册监听,有注册上来的时候才处理。不知道这样是否满足。
    fpure
        31
    fpure  
    OP
       2021-04-28 21:38:17 +08:00
    @shanghai1943 已经换思路解决了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3306 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:36 · PVG 19:36 · LAX 03:36 · JFK 06:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.