Java: Spring AOP 和重构

Java: Spring AOP & Refactoring

所以我开始接触 Spring AOP,我突然想到了一些事情。配置aspect时,注解都是使用Strings作为参数,而不是Class个对象。

我提出这个问题是因为这意味着 IDE(我使用的是 Eclipse,所以我在这里只引用它)将无法正确重构方面。所以如果我有一个 class MyClass,方法是 public void foo(),Spring AOP 注释的一个例子是这样的:

@Before ("execution(public void package.MyClass.foo())")

因为注解中的param是String,如果我重构方法名为publicvoid foo2(),会破坏这方面的绑定

我一直在搜索各种论坛和教程,但我到处都看到了字符串参数,这表明这是这里唯一的选择。我想你可以通过在声明绑定的方式上更通用一些来解决这个问题:

@Before ("exeuction(public void package.MyClass.set*(..))")

这个新方法适用于 MyClass 中的任何 setter 方法,具有任意数量的参数(或没有参数)。当然,这样含糊其词也未必总是行得通。

无论如何,我在这里咆哮了一点,已经很晚了,我有点累了,我的大脑都在寻找这个问题的答案。但我的最后一个问题是:是否有任何方法可以设置 Spring AOP 注释以便重构会影响它们?

谢谢。

好吧,AOP 的全部要点是以模块化方式实现横切行为,并将其应用于应用程序代码,理想情况下,应用程序代码不了解任何方面。因此,您在两者之间没有固定的联系。重要的是要记住,在维护和重构应用程序代码的同时,还应该用它重构方面,以确保切入点不会中断。

话虽如此,如果您安装 AJDT(AspectJ 开发工具)[=60,Eclipse 和其他 IDE 仍然会提示您在何处应用哪些方面=].我主要使用完整的 AspectJ,而不是名为 [= 的基于代理的 "AOP lite" 变体80=] AOP,所以我不知道AJDT对Spring AOP是否有用。不过,它将通过 LTW(加载时编织)将 AspectJ 应用于 Spring。

这是"Aspect Visualisation"视角的截图:

它以图形方式显示哪些方面适用于代码的哪些部分。如果双击任何虚线,代码编辑器将引导您到应用方面的确切位置。

还有 交叉引用视图 在方面代码和普通 Java 代码中有很少的指示符:

右侧是交叉引用视图,列出了适用于当前所选方法的所有方面。左侧有一些小图标,指示哪种类型的建议适用于每种方法。

顺便说一句,交叉引用视图也适用于方面。当您将光标置于建议内时,外部参照视图会列出代码中建议适用的所有位置:

还有更多:AspectJ 编译器 可以配置为列出方面代码建议的所有连接点。您可以手动或什至在自动冒烟测试中检查输出是否有更改。例如,如果由于您更改了一些包、class 或方法名称而导致某个建议不再适用,则会出现 Xlint 警告 "adviceDidNotMatch" and/or 有时也"invalidAbsoluteTypeName"。此外,相关建议的交叉引用视图将为空:

如您所见,在重构应用程序或方面代码时,AJDT 中有很多指示器和助手。

还有一件事:如果您使用 AspectJ 而不是 Spring AOP,您可以选择使用更简洁和更具表现力的 原生 AspectJ 语法 而不是注释-样式语法。我绝对更喜欢前者而不是后者。然后,您的代码编辑器中不仅有字符串,还有更好的语法突出显示以及代码完成和重构。

最后但同样重要的是:您还应该为您的方面代码编写单元测试和集成测试,以便注意方面是否中断。手动检查很好,但在即时反馈方面,自动回归测试是无与伦比的。 ;-)