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

2021-04-27 23:00:09 +08:00
 fpure

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

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

亲测可以
Kasumi20
2021-04-28 09:29:39 +08:00
你这是运行时编织,这个类必须是 @Component 注解的 Bean
fpure
2021-04-28 09:42:26 +08:00
@Kasumi20 不行啊,这个还是只能拦截加了注解的方法,不能拦截类中没有加注解的方法
Kasumi20
2021-04-28 09:43:56 +08:00
@fpure 加一个注解也不累啊,总比加代码好
xiaoxinshiwo
2021-04-28 09:47:11 +08:00
懂你的描述了,好麻烦啊,可否将自定义注解加在类上啊
fpure
2021-04-28 09:47:34 +08:00
@Kasumi20 好吧,我打算换思路了,我试试在 spring boot 中怎么延迟执行任务
Xhack
2021-04-28 09:50:48 +08:00
execution(访问权限符 返回值类型 方法全类名(参数表))
liudaolunhuibl
2021-04-28 09:51:36 +08:00
做不到的吧,只能切这个方法,或者你把注解写在类上
fpure
2021-04-28 09:54:25 +08:00
@xiaoxinshiwo 我对 spring aop 的期望太理想化了,我简直无法理解 pointcut 函数存在的目的仅仅是为了定义一个切点表达式,哪怕是用这个函数判断那些类和函数可不可以被拦截也好啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773715

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX