java - 如何配置 Spring AOP 以使用 AspectJ

标签 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。不幸的是,这并没有帮助,添加注解后,并没有发生对注解方法的拦截。

有很多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/

相关文章:

java - 删除hibernate实体问题?

java - 睡在 SwingWorker 里?

java - 如何使用条件查询查找具有外键的记录。它是使用 hbm.xml 完成的具有外键的 hibernate 一对一双向映射

c# - Autofac拦截目标方法

java - 为什么@AfterReturning 只在@AfterThrowing 之后执行异常?

c# - MonoDroid 中带有 AOP (PostSharp) 的 IoC

Java/斯卡拉 Swing : Make a component fill all available space in a row

java - 如何为 spring 规范编写单元测试?

spring - 根据启动 Spring MVC 时指定的模式启用/禁用不同的 Controller 集

javax.管理.InstanceNotFoundException : Catalina:type=Server occurs when I run debug using Tomcat7 in IntelliJ IDEA