Spring Boot AOP

4

我在尝试执行我的建议时遇到了一些问题。我尝试了几个不同的切入点,但都没有成功。"@EnableAspectJProxy"似乎有效并检测到我的方面。感谢任何建议。

我正在使用spring-boot-aop-starter。

@Aspect
@Component
public class ExecutionTimeLogger {

    private Logger logger;

    public ExecutionTimeLogger() {
        logger = LoggerFactory.getLogger(getClass());
        logger.info("HEY");
    }

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void controller() {}

    @Pointcut("execution(* edu.x.y.z.server.web.controller.*.*(*))")
    public void methodPointcut() {}

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

    @Around("controller() && methodPointcut() && requestMapping()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch sw = new StopWatch();
        String name = pjp.getSignature().getName();
        try {
            sw.start();
            return pjp.proceed();
        } finally {
            sw.stop();
            logger.info("STOPWATCH: " + sw.getTime() + " - " + name);
        }
    }
}

我正在尝试匹配我的包中使用了 @RequestMapping 注解的任何方法。我也尝试过非常通用的匹配所有方法,但没有成功。

这是一个应该应用建议的方法示例:

@RequestMapping(value = "/analysis", method = RequestMethod.GET)
@ApiOperation(value = "Get analyses available for the current user")
JsonModelAndView getAllAnalyses(HttpServletRequest request)

你期望发生什么?你有一个想要被拦截却没有被拦截的方法示例吗? - Dave Syer
我希望我的包“edu.x.y.z.server.web.controller”中用“@RequestMapping”注解标记的方法受到拦截。该建议应通过执行时间和被拦截方法的名称向控制台提供输出。 - user1595702
2个回答

8

我已经解决了这个问题。最终,我创建了一个小的Spring应用程序,测试使用特定切入点来删除其他潜在障碍的用例。我发现我的切入点需要做一些调整。

@Aspect
@Component
public class ExecutionTimeLogger {

    private Logger logger;

    public ExecutionTimeLogger() {
        logger = LoggerFactory.getLogger(getClass());
        logger.info("HEY");
    }

    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void requestMapping() {}

    @Pointcut("execution(* edu.x.y.z.server.web.controller.*Controller.*(..))")
    public void methodPointcut() {}

    @Around("requestMapping() && methodPointcut()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch sw = new StopWatch();
        String name = pjp.getSignature().getName();
        try {
            sw.start();
            return pjp.proceed();
        } finally {
            sw.stop();
            logger.info("STOPWATCH: " + sw.getTime() + " - " + name);
        }
    }
}

正如您所看到的,最大的区别在于注解切入点。


2
是的,这是一个很大的改变。你最初的尝试只匹配带有@RequestMapping注解的类。 - Dave Syer

2

如果您的控制器没有接口,可能需要将proxyTargetClass设置为true。使用自己的@EnableAspectJAutoProxy或设置spring.aop.proxyTargetClass=true


我尝试使用这种方法,但没有成功。 - user1595702

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接