如何用 aop 切入指定 bean 的所有方法?急

2020-03-23 21:33:21 +08:00
 DanielGuo

难点在于指定的 bean

目前有很多个不同的类,没有规律,类文件还无法改动,都是自动生成的。后期还会继续增多。也就是说不能在 aspect 中写死 expression 限定。

能不能在下述方式声明 bean 的同时,将 A 和 B 的所有方法声明成切入点?
@Bean
类 A getA (){}
@Bean
类 B getB (){}

1526 次点击
所在节点    问与答
12 条回复
lu5je0
2020-03-23 21:36:56 +08:00
BeanPostProcessor
DanielGuo
2020-03-23 21:49:12 +08:00
我知道可以把 bean 命名成统一后缀,然后 expression 匹配后缀,但是我觉得这样不优雅。 有没有像加注解的方式?可以在 @Bean 上再加一个注解标明切点
DanielGuo
2020-03-23 21:49:57 +08:00
@lu5je0 BeanPostProcessor 要实现接口啊。。。现在这些类都是无法改动的,第三方类
lu5je0
2020-03-23 22:07:51 +08:00
@DanielGuo 第三方的类不需要实现 BeanPostProcessor,你可以再了解一下
securityCoding
2020-03-23 22:16:32 +08:00
@DanielGuo 可以, 比如记录请求日志
@Around("(@annotation(org.springframework.web.bind.annotation.RequestMapping)" +
"||@annotation(org.springframework.web.bind.annotation.GetMapping)" +
"||@annotation(org.springframework.web.bind.annotation.PostMapping)" +
"||@annotation(org.springframework.web.bind.annotation.PutMapping)" +
"||@annotation(org.springframework.web.bind.annotation.DeleteMapping))"
)
DanielGuo
2020-03-23 22:29:59 +08:00
@securityCoding 这样确实是最直观的,就是感觉有点笨笨的,要是能把注解标在 @Bean 方法上就优雅多了
DanielGuo
2020-03-23 22:31:19 +08:00
@securityCoding 现在我的痛点就是,我想切的类。。上面并没有注解
DanielGuo
2020-03-23 22:33:37 +08:00
@lu5je0 不好意思,记混了,第三方类确实不用实现接口,processor 是对所有 bean 进行遍历。。。但是现在的痛点就是遍历过程中我无法分辨哪些 bean 是需要切的
zerozerone
2020-03-23 23:23:51 +08:00
自定义 bean 扫描,扫到需要增强的 bean 之后再手动注册到容器
MoHen9
2020-03-24 07:48:15 +08:00
最近想分享 AOP 的一些小技巧,这个兴许可以帮到你,https://github.com/dingxiuan/springboot-doughnut/blob/master/aop/src/main/java/com/benefit/aop/AopWebRequestAspect.java

如果你有疑问,可以在 V2 给我发消息
DanielGuo
2020-03-24 08:48:42 +08:00
@MoHen9 谢谢,pointcut 里用 bean()是适用于我这个场景的。但是我觉得实例都声明成同一个 name 后缀不太好拓展,有办法把 beans 分组,设置一个组名,然后 aspectJ 识别吗?
MoHen9
2020-03-24 09:58:46 +08:00
@DanielGuo 可以举个例子吗?我不太理解你的场景

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

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

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

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

© 2021 V2EX