我想使用 AOP 概念来计算我用我创建的注释标记的某些方法的执行时间。然而,我的问题是我在同一个类中内部引用带注释的方法。例如:
public void login(params) {
some logic ...
performLogin();
some logic ...
}
@Measured
public void performLogin() {
some logic ...
}
这是一个已知问题,因为 Spring AOP 使用基于代理的方法,无法“看到”同一类中的内部调用。显然我可以通过使用 AspectJ 而不是 Spring AOP 来解决这种情况。如果我理解正确的话,它可以从 Spring 本身进行配置。根据我的发现,我似乎应该包含 @EnableAspectJAutoProxy
注释来配置 Spring 使用 AspectJ 而不是它自己的 AOP。不幸的是,这并没有帮助,添加注解后,并没有发生对注解方法的拦截。
有很多information关于 Spring 引用文档中的这个主题,我有点迷失了。我还需要做什么才能使用 AspectJ 吗?
P.S.请注意,我无法重构整个类并将调用方法移到外部。
P.P.S. 我还验证了我的切入点配置。我注释了外部调用的调用方法,效果很好。
最佳答案
代理只能实现实际AspectJ系统全部功能的子集,基本上是包装方法的建议。由于其性质,代理具有以下限制:
- 仅拦截外部调用(违反代理边界时)
- 仅对公共(public)成员进行拦截(私有(private)/ protected 成员无法拦截) 不知道本地调用(或使用 this 或 super 进行的调用)
<aop:aspectj-autoproxy />
还不够 - 它只包装方法,你需要这样的东西:<context:load-time-weaver/>
例如,如果您希望能够建议字段,则需要启用 Native AspectJ 的使用.
关于java - 如何配置 Spring AOP 以使用 AspectJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44383711/