我有一个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方法。
答案 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() {
}