gpt4 book ai didi

java - Spring AOP 不拦截 Spring 容器内的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:32 25 4
gpt4 key购买 nike

我是 Spring AOP 的新手。
使用基于注释的 Spring 配置:

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
@ComponentScan({"sk.lkrnac"})

看点:

@Aspect
@Component
public class TestAspect {
@Before("execution(* *(..))")
public void logJoinPoint(JoinPoint joinPoint){
....
}

}

Spring 组件:

package sk.lkrnac.testaop;

@Component
public class TestComponent{
@PostConstruct
public void init(){
testMethod();
}

public void testMethod() {
return;
}
}

如何拦截Spring框架本身调用的所有公共(public)方法? (例如 TestComponent.init() 在 Spring 创建 TestComponent 实例期间)目前我只能通过调用拦截 TestComponent.testMethod():

TestComponent testComponent = springContext.getBean(TestComponent.class);
testComponent.testMethod();

最佳答案

这是您在使用 Spring AOP 时遇到的常见问题。 Spring 通过代理建议的类来完成 AOP。在您的情况下,您的 TestComponent 实例将被包装在一个运行时代理类中,该代理类为要应用的任何方面建议提供“ Hook ”。当从类的外部 调用方法时,这非常有效,但正如您所发现的那样,它不适用于内部调用。原因是内部调用不会通过代理屏障,因此不会触发切面。

主要有两种解决方法。一种是从上下文中获取(代理的)bean 的实例。这是您已经成功尝试过的方法。

另一种方法是使用称为加载时编织的东西。使用它时,自定义类加载器通过将字节代码注入(inject)到类定义中,将 AOP 建议添加到类中(“编织”到类中)。 Spring 文档有 more对此。

还有第三种方式,称为“编译时编织”。在这种情况下,您的 AOP 建议会在编译时静态编织到每个建议类中。

关于java - Spring AOP 不拦截 Spring 容器内的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14111422/

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