【发布时间】:2014-06-25 00:01:40
【问题描述】:
我想从一个类列表(可能属于不同的包)中记录所有方法的条目。请注意,方法应仅属于指定的类。
我尝试了以下方法,但这些都不起作用
(1) 使用 if() 切入点 在这里我得到一个错误
"incompatible number of arguments to pointcut, expected 1 found 0"
@Pointcut("execution(*.*(..)) && if()")
public static boolean mycut(JoinPoint jp) {
boolean matches = ... ;//Test using jp if the declaring class belongs to the list
return matches;
}
(2) 结合使用Pointcut和aop.xml 在这里我得到一个错误
java.lang.NoSuchMethodError:
com.mypackage.TraceAspect.aspectOf()Lcom/df/jc/aspect/TraceAspect;
//in com.mypackage.TraceAspect aspect class
@Pointcut("execution(*.*(..)) && !within(com.mypackage.TraceAspect)")
public void mycut(){
}
//in aop.xml
<weaver>
<include within="package1.Class1">
<include within="package2.Class2">
<include within="package3.Class3">
</weaver>
这里出了什么问题?
当然可以通过在切入点中单独指定每个类来完成,但这对于数百个类是不可扩展的。理想情况下,如果可以从外部文本文件中获取类列表(以便于配置),那就太好了
【问题讨论】:
-
找到了这个解决方案,但最好能从aop.xml以外的外部文件中获取所需的类stackoverflow.com/questions/18130336/…
-
为什么? aop.xml 不够外部吗?顺便说一句,如果你有数百个类,其中许多应该有一些共同点:类名前缀/后缀、包名、实现的接口、标记注释。有几十种方法可以重构代码,以便更容易表达简短的切入点,而不是维护容易出错且通常过时的包含数百个条目的列表。 AOP 并不是要修补糟糕的应用程序设计。恕我直言,您希望这样做的方式是一种症状,而不是问题的根本原因。
-
这是基于现实世界的要求 - 并非所有代码都是好的代码:1) 源代码中有很多包(我想关注)与其他一些专有的罐子(我不想谈)。 2) 代码是遗留的,写了很多年,有很多用户——所以重构是不可能的 3) 人们可能会争论编写一个预处理器,将类列表转换为 aop.xml,但这会引入两个额外的步骤 - a) 运行预处理器 b) 将 aop.xml 放到正确的类路径中 4) 最后只是寻找一个简单的解决方案
-
您在自己的代码中使用专有包名称?难以置信。恭喜。无论如何,您根本不需要将这些专有 JAR 暴露给编织者,因此它们完全无关紧要。您想寻求简单的解决方案吗?使用该死的aop.xml! P.S.:重构遗留代码从来都不是不可能的。我的敏捷团队(我是一名 Scrum 教练)每天都使用遗留代码来做这件事。对于任何体面的 IDE,添加标记注释和重新编译应该足够简单。但无论如何:停止在任何解决方案中寻找问题。开始为您的实际问题寻找解决方案。
-
>> 您在自己的代码中使用专有包名称?难以置信。恭喜。 >> 这是我们自己的专有罐子(不是第 3 方)。 >> 但无论如何:不要在任何解决方案中寻找问题。开始为您的实际问题寻找解决方案。来吧!您可以提出解决方案或不提供解决方案,或者根本不发表评论。你能做的最糟糕的事情就是训斥并阻止人们试图找到比你给出的更好的解决方案