java - 使用 AspectJ 的日志 Controller

标签 java spring spring-boot aop aspectj

我有一个 Spring boot 应用程序,我想记录一些信息,当调用 Controller 方法 id 时会发生什么情况。

由于某种原因,我的方面无法正常工作。

这是我用 @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 方法。

最佳答案

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

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

@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");
  }

}

关于java - 使用 AspectJ 的日志 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55942171/

相关文章:

java - 是否可以将换行符写入套接字的 OutputStream?

java.lang.VerifyError 尝试运行时需要精确引用阻止 Kotlin 在 Android 中暂停乐趣

java - 对事务提交执行操作

java - 如何在同一个数据库表上映射两个 JPA 或 Hibernate 实体

java - org.hibernate.internal.util.xml.XMLHelper.<init>(Lorg/hibernate/boot/registry/classloading/spi/ClassLoaderService 但它不存在

java - 为什么我不能创建大尺寸的数组?

javax.validation.ValidationException : HV000041: Call to TraversableResolver. isReachable() 抛出异常

java - 没有找到适合响应类型的 HttpMessageConverter

spring - 升级到 Spring boot 2.x 后请求映射不起作用

java - DynamoDB 等待表变为 Activity 状态