V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
DanielGuo
V2EX  ›  问与答

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

  •  
  •   DanielGuo · 2020-03-23 21:33:21 +08:00 · 1355 次点击
    这是一个创建于 1467 天前的主题,其中的信息可能已经有所发展或是发生改变。

    难点在于指定的 bean

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

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

    12 条回复    2020-03-24 09:58:46 +08:00
    lu5je0
        1
    lu5je0  
       2020-03-23 21:36:56 +08:00 via Android
    BeanPostProcessor
    DanielGuo
        2
    DanielGuo  
    OP
       2020-03-23 21:49:12 +08:00
    我知道可以把 bean 命名成统一后缀,然后 expression 匹配后缀,但是我觉得这样不优雅。 有没有像加注解的方式?可以在 @Bean 上再加一个注解标明切点
    DanielGuo
        3
    DanielGuo  
    OP
       2020-03-23 21:49:57 +08:00
    @lu5je0 BeanPostProcessor 要实现接口啊。。。现在这些类都是无法改动的,第三方类
    lu5je0
        4
    lu5je0  
       2020-03-23 22:07:51 +08:00 via Android
    @DanielGuo 第三方的类不需要实现 BeanPostProcessor,你可以再了解一下
    securityCoding
        5
    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
        6
    DanielGuo  
    OP
       2020-03-23 22:29:59 +08:00
    @securityCoding 这样确实是最直观的,就是感觉有点笨笨的,要是能把注解标在 @Bean 方法上就优雅多了
    DanielGuo
        7
    DanielGuo  
    OP
       2020-03-23 22:31:19 +08:00
    @securityCoding 现在我的痛点就是,我想切的类。。上面并没有注解
    DanielGuo
        8
    DanielGuo  
    OP
       2020-03-23 22:33:37 +08:00
    @lu5je0 不好意思,记混了,第三方类确实不用实现接口,processor 是对所有 bean 进行遍历。。。但是现在的痛点就是遍历过程中我无法分辨哪些 bean 是需要切的
    zerozerone
        9
    zerozerone  
       2020-03-23 23:23:51 +08:00 via Android
    自定义 bean 扫描,扫到需要增强的 bean 之后再手动注册到容器
    MoHen9
        10
    MoHen9  
       2020-03-24 07:48:15 +08:00 via Android
    最近想分享 AOP 的一些小技巧,这个兴许可以帮到你,https://github.com/dingxiuan/springboot-doughnut/blob/master/aop/src/main/java/com/benefit/aop/AopWebRequestAspect.java

    如果你有疑问,可以在 V2 给我发消息
    DanielGuo
        11
    DanielGuo  
    OP
       2020-03-24 08:48:42 +08:00 via iPhone
    @MoHen9 谢谢,pointcut 里用 bean()是适用于我这个场景的。但是我觉得实例都声明成同一个 name 后缀不太好拓展,有办法把 beans 分组,设置一个组名,然后 aspectJ 识别吗?
    MoHen9
        12
    MoHen9  
       2020-03-24 09:58:46 +08:00
    @DanielGuo 可以举个例子吗?我不太理解你的场景
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2427 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.