求大佬指教这个 spring aop 的切点表达式怎么写 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fpure
V2EX    Java

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

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

    我有一个类,类里面的某个方法上有一个自定义注解,现在我想用 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   1
    @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     Solana     2591 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 08:22 PVG 16:22 LAX 00:22 JFK 03:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86