Java:Spring AOP&∧重构

2022-04-16 00:00:00 spring aop java

所以我开始使用Spring AOP,我突然想到了一些事情。配置方面时,所有批注都使用字符串作为参数,而不是使用类对象。

我之所以提出这个问题,是因为这意味着IDE(我使用的是Eclipse,所以我在这里只引用它)将不能正确地重构方面。因此,如果我有一个MyClass类,它的方法是公共的void Foo(),则Spring AOP批注的示例如下:

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

因为批注中的参数是一个字符串,所以如果我将方法名重构为公共void foo2(),它将破坏此方面的绑定。

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

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

这个新方法适用于MyClass中的任何setter方法,具有任意数量的参数(或没有参数)。当然,像这样含糊其辞可能并不总是奏效。

无论如何,我在这里有点咆哮,很晚了,我有点累了,我的大脑因为寻找答案而筋疲力尽。但我的最后一个问题是:有没有办法设置Spring AOP注释,以便重构可以影响它们?

谢谢。

AOP

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

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

这里是"方面可视化"视角的屏幕截图:

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

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

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

顺便说一句,交叉引用视图也是从方面工作的。将光标放在建议内时,外部参照视图将列出代码中应用该建议的所有位置:

还有更多:AspectJ编译器可以这样配置,以列出方面代码建议的所有连接点。您可以手动检查输出更改,甚至可以在自动烟雾测试中检查更改。例如,如果因为您更改了一些包、类或方法名称而导致建议不再适用,则会出现Xlint警告"AdviceDidNotMatch"和/或有时还会出现"validAboluteTypeName"。此外,有问题的建议的交叉引用视图将为空:

正如您刚才看到的,在重构应用程序或方面代码时,AJDT中有很多指示器和帮助器。

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

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

相关文章