【发布时间】:2018-03-07 19:17:35
【问题描述】:
class Test {
@override
public String a(){
b();
d();
}
private String b() {
c();
}
private String c(){
d();
}
private String d(){}
}
我想拦截从重写方法 A() 调用的 Test 类的每个方法,并想知道每个方法(如 b()、c())在分别处理某些业务逻辑时花费了多少时间。
如何使用 Spring AOP 或 Aspectj 实现它?
【问题讨论】:
-
你试过什么?你目前的方面是什么样的?你遇到了什么问题?
-
@kriegaex 我尝试使用 Spring AOP(为给定包编写@Around)来实现这个目标,并且能够成功拦截方法 a() 但无法找出如何拦截和记录时间由代码重构的结果 b()、c() 和 d() 采用。我对 AspectJ 的想法很少,也不知道如何更好地做到这一点。请帮助我
-
我发布了一个答案,但不太清楚的是,您是否还要检查该方法是否由运行时调用?在这种情况下,您可以拦截我的回答中提到的方法,然后使用
Thread.currentThread().getStackTrace()检查堆栈跟踪以查看 a() 是否是调用方方法。 -
José,如果需要的话,这不是去这里的方式。您可以将
cflow()和AspectJ 与LTW 一起使用。无论如何,您已经建议了后者。但我们在猜测。 AspectJ 可以解决所有这些技术问题,不仅是自调用,还可以拦截私有方法,而这两者都是 Spring AOP 所不能做到的。 Spring AOP 也不知道cflow()。方法首先是否应该是私有的问题是另一个问题。我们不能说他们是否有假名,如a()、b()等。@Crazy-Coder:你试过 AspectJ 教程吗? -
这与你的工作有关不是借口。就像我在回答中编造了一个 MCVE 一样,您可以编造一个完全反映您的问题的内容,而无需透露任何工作细节。您让我们猜测,没有明确说明问题出在哪里,而是让我们完成您的工作,即为您编写可编译和可执行的示例代码,而不仅仅是修复您的。因此,请接受并投票赞成一个答案。如果重构为多个 bean 并使所有方法公开或包范围是一个选项,请选择 José's,否则选择我的。
标签: java aspectj spring-aop spring-aspects