2017-06-06 63 views
0

我想使用AOP概念来定义某些方法的执行时间,这些方法是使用我创建的注释标记的。然而,我的问题是,我在同一个类内部引用了注释方法。例如:如何配置Spring AOP以使用AspectJ

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.我也验证了我的切入点配置。我注释了外部调用的调用方法,它工作正常。

回答

0

代理只能实现实际系统的全部功能的子集,基本上是包装方法的建议。由于其性质或代理都下列限制:

  • 仅外部呼叫拦截(而违反代理界)
  • 拦截公众成员(专用/保护不被截取) 不了解当地电话(或与此或超)

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

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

+0

嗨,谢谢你的回答。这正是我想要做的。只是在配置上挣扎。 –

+0

如果您使用的是java配置,请尝试为配置添加'@ EnableLoadTimeWeaving',并在我的回答 –

+1

中检查到Native AspectJs的链接,或使用编译时编织 – JEY