4

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

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

方面:

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

}

弹簧组件:

package sk.lkrnac.testaop;

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

    public void testMethod() {
        return;
    }
}

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

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

3 回答 3

6

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

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

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

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

于 2013-01-02T10:02:41.313 回答
0

init()没有任何显式的方式是无法拦截的,详情请查看 SpringSource Jira

于 2013-01-01T15:55:21.027 回答
0

您还可以尝试通过代理对象从 init() 调用内部 testMethod(),如https://stackoverflow.com/a/5786362/6786382中解释的 Don 。

于 2016-09-02T07:24:50.807 回答