如何配置Spring AOP以使用AspectJ

时间:2017-06-06 07:21:23

标签: java spring aop aspectj spring-aop

我想使用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。不幸的是,它没有帮助,并且在添加注释之后,没有发生对注释方法的拦截。

在Spring参考文档中有很多关于这个主题的information,我有点迷失了。还有什么我应该做的,以便使用AspectJ吗?

P.S。请注意,我无法重构整个课程并将调用方法移到外面。

P.P.S。我还验证了我的切入点配置。我注释了外部调用的调用方法,它工作正常。

1 个答案:

答案 0 :(得分:0)

代理只能实现实际 AspectJ 系统的全部功能的子集,基本上是包装方法的建议。由于它们的性质,代理具有以下限制:

  • 仅拦截外部呼叫(在破坏代理边界时)
  • 仅对公众成员进行拦截(私人/受保护不能被截获) 不知道本地电话(或使用此电话或超级电话)

<aop:aspectj-autoproxy />是不够的 - 它只包装方法,你需要这样的东西:<context:load-time-weaver/>

如果您希望能够提供字段建议,则需要启用Native AspectJ