gpt4 book ai didi

java - RestController 父类的 Aspect 方法不会触发通知逻辑

转载 作者:行者123 更新时间:2023-12-02 12:00:51 24 4
gpt4 key购买 nike

我有一些我非常喜欢使用方面的构造。我想让我的 RestController 从一个类继承,该类产生特殊的日志记录方法,

  1. 记录到标准 logback 输出
  2. 向服务发送一个 http 请求,该服务会处理日志消息以及(由方面完成)

我创建了一个注释,用它标记了我想要关注的方法,这样切入点就无法过滤它。特殊情况是该方法是在 RestController 的父类中声明的。

即使 IntelliJ 将该方法标记为该方面正在使用,该方面也没有运行,这告诉我切入点必须工作?

enter image description here

请查看我的代码并检查我可能错过了什么以使其正常工作。

应用程序类

@SpringBootApplication
@ComponentScan("com.xetra.experimental")
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AopTryoutApplication {

public static void main(String[] args) {
SpringApplication.run(AopTryoutApplication.class, args);
}
}

RestController

@RestController
public class Endpoint extends SimpleLogger {
@GetMapping("/endpoint")
public void doStuff(){
log("foo");
}
}

RestController的父类

public class SimpleLogger implements EndpointLogger{
@AspectAnnotation
public void log(String msg) {
System.out.println(msg);
}
}

父类的接口(interface)(听说切面方法需要接口(interface))

public interface EndpointLogger {
void log(String msg);
}

我的方面应指向的注释

@Inherited
public @interface AspectAnnotation {
}

Spring AOP方面

@Component
@Aspect
public class TestAspect {

@Pointcut("@annotation(com.xetra.experimental.aoptryout.AspectAnnotation)")
public void methods() {
}

@Before("methods()")
public void beforeMethodExecution(JoinPoint jp) {
System.out.println("Aspect ran!!!!");
}

}

最佳答案

Due to the proxy-based nature of Spring’s AOP framework, calls within the target object are by definition not intercepted.

您可以找到更多here .

log 方法的调用不会被拦截,因为它是从属于同一目标对象的 doStuff 方法进行的。

现在,只要是从另一个对象(不是同一目标对象)外部进行的对 log 方法的任何调用都将被拦截。

问题

所以,如果我使用 SimpleLogger 作为组件而不是 Endpoint 中的父类,它会起作用吗?

是的,你说得对!

有什么方法可以让它发挥作用吗?喜欢使用 AspectJ 而不是 Spring AOP?

您可以使用 AspectJ 的源编织来使其工作。 Here ,是一个工作示例。

关于java - RestController 父类的 Aspect 方法不会触发通知逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47262963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com