使用AspectJ的日志控制器

时间:2019-05-01 20:14:30

标签: java spring spring-boot aop aspectj

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

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

这是我的@Component类,其注释为@Aspect:

@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 个答案:

答案 0 :(得分:2)

重要:如您所述,您正在使用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");
  }

}

答案 1 :(得分:1)

在运行时,您的控制器带有@RestController注释,而不是 @Controller注释。

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

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