如何使用SpringBoot AOP拦截单个方法

How to intercept a single method using SpringBoot AOP

我试图在调用函数 someFunction() 时输出一条日志消息。

这是我的看点:

@Aspect
@Component
public class MyAspect {

    private static final Logger LOGGER = Logger.getLogger(MyAspect.class.getName());

    @Pointcut("execution(com.practice.AOP.someFunction())")
    public void outputLogMessage() {
        LOGGER.info("someFunction has been invoked");
    }
}

我试图拦截的方法 someFunction() 位于 com.practice.AOP class 中。当我调用它时(如下所示),我的建议(日志消息)没有输出,也没有收到错误。我究竟做错了什么?切入点是否可行?

@SpringBootApplication
public class AOP {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
        someFunction();
    }

    public static void someFunction() {
        //should invoke the log message
    }
}

Spring AOP 仅适用于 Spring bean,并且仅适用于从外部调用的那些 spring bean 的 public 实例方法(即 this.publicMethod()样式调用将不起作用,因为它们不会通过 Spring AOP 创建的代理来通知您的 spring bean。

如果这对您来说还不够,例如,如果您不仅需要建议 spring bean,还需要建议非 spring 托管代码,或者像您示例中的静态方法,您将需要通过编译时编织或加载时编织切换到本机 AspectJ 支持。