我很难理解你在这里要求什么。一般来说,我不知道“在方法内捕获日志”意味着什么,但我认为无论如何我可以提供一些帮助。
在我看来,您想将代码任意插入到方法中的随机点,而不一定是在方法的开头或结尾。一般来说,Spring AOP 不能做到这一点,我不确定 AspectJ 是否能够提供帮助,但我对此不太熟悉,无法给你一个明确的答案。
正如您所说,Spring AOP 可以在代码库中的各种 JoinPoints 之前/之后/周围注入。这些 JoinPoints 将是方法,并且仅在 Spring 托管类中。
因此,如果您有如下方法,您可以添加日志记录(通过System.out
在这种情况下)通过一个围绕它@Around
aspect.
代码:
public void test() {
System.out.println("I am in a method now");
}
方面:
@Around("execution(public * *(..))")
public void publicMethods(ProceedingJoinPoint pjp) {
System.out.println("before in an aspect");
pjp.proceed();
System.out.println("after in an aspect");
}
这本质上将初始方法变成了这个(以及添加这些System.out
是所有公共方法):
public void test() {
System.out.println("before in an aspect");
System.out.println("I am in a method now");
System.out.println("after in an aspect");
}
根据代码的布局,您可以通过在要插入的点处创建方法来有效地任意插入。我不推荐这样做,但这当然是可能的。
最后,对您的问题进行解答:
- 您可以将记录器替换为
@Before
方面,假设日志记录行是方法中的第一个代码。如果您要这样做,那么您将能够从方法内删除日志记录。我不太清楚你最后一句的要求是什么,但是不,Spring AOP 不会在方法的“内部”查找。
- Spring AOP 能够“捕获”它,因为 Spring 将代理该类。
- Spring AOP 的要点是能够“拦截”方法调用。您可能看不到它的真正用途,但它非常有用。我对最后一句持不同意见,当使用 Spring AOP 时,我希望能够检查我的方法中正在发生什么,或者会发生什么。
EDIT:
你是对的,日志调用可以被删除,并由方面处理。必须注意的是,切面调用 log 方法的唯一机会是在实际方法调用之前或之后。