为了账号安全,请及时绑定邮箱和手机立即绑定

使用 AspectJ 的日志控制器

使用 AspectJ 的日志控制器

皈依舞 2022-11-02 15:56:53
我有一个 Spring Boot 应用程序,我想记录一些信息,当调用 Controller 方法 id 时会发生什么。出于某种原因,我的 Aspect 无法正常工作。这是我用@Aspect 注释的@Component 类:@Pointcut("within(@org.springframework.stereotype.Controller *)")public void controller() {}@Pointcut("execution(* *.*(..))")protected void allMethod() {}@Before("controller()&& allMethod()")public void logBefore(JoinPoint joinPoint) {}当使用 REST 调用任何 Controller 方法时,不会调用 logBefore 方法。
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

重要提示:正如您所说,您使用的是 Spring Boot 设置,我的假设是您已经实现了 Spring AOP 模块而不是“实际的”AspectJ 库。差异是显着的,因为 AOP 的实现在它们之间有所不同。Spring 使用 AspectJ 注释来应用代理,而 AspectJ 将代码“编织”到您的应用程序中。简而言之,Spring AOP 可能更容易实现,而 AspectJ 提供了更细粒度的功能(例如编译时编织)。可以在这里找到比较。


我已经从您在帖子中提供的代码片段中尝试了配置。在我添加了几个注释后调用了该建议:


@SpringBootApplication

// Be sure to add EnableAspectJAutoProxy and set proxyTargetClass to true

@EnableAspectJAutoProxy(proxyTargetClass = true)

public class DemoApplication {

  ...

}

// Be sure to add @Aspect and @Component

@Component

@Aspect

public class DemoAop {


  private static Logger logger = LoggerFactory.getLogger(DemoAop.class);


  @Pointcut("within(@org.springframework.stereotype.Controller *)")

  public void controller() {

  }


  @Pointcut("execution(* *.*(..))")

  protected void allMethod() {

  }


  @Before("controller()&& allMethod()")

  public void logBefore(JoinPoint joinPoint) {

    logger.info("TEST");

  }


}


查看完整回答
反对 回复 2022-11-02
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

在运行时,您的控制器使用 @RestController 而不是 @Controller 进行注释。

只需将切入点更改为 RestController 即可:

 @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
 public void controller() {
 }


查看完整回答
反对 回复 2022-11-02
  • 2 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号