当前位置: 首页 > 知识库问答 >
问题:

Java:Spring AOP和重构

公冶麒
2023-03-14

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

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

因为注释中的param是一个字符串,如果我将方法名重构为public void foo2(),就会破坏这个方面的绑定。

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

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

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

共有1个答案

东门航
2023-03-14

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

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

以下是“方面可视化”视角的截图:

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

顺便说一句,交叉引用视图还可以从方面工作。当您将光标放置在通知中时,xref视图将列出代码中应用通知的所有位置:

还有更多:可以这样配置AspectJ编译器,以便列出方面代码建议的所有连接点。您可以手动或甚至在自动烟雾测试中检查输出的更改。例如,如果由于更改了一些包、类或html" target="_blank">方法名而不再适用建议,则会出现Xlint警告“AdvicedIdNotMatch”和/或有时还会出现“InvalidAbsoluteTypeName”。此外,相关建议的交叉引用视图将为空:

还有一点:如果您使用AspectJ而不是Spring AOP,您可以选择使用更简洁、更有表现力的本地AspectJ语法,而不是注释样式的语法。比起后者,我肯定更喜欢前者。那么您在代码编辑器中就不仅仅是字符串了,更好的语法高亮显示、代码完成和重构。

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

 类似资料:
  • 如您在使用手表时遇到问题,可以尝试重启。重启手表不会删除手表上的任何设置或个人数据。 重启手表 在手表上,按下“返回”按钮,然后前往设置 > 一般设置 > 关于手表,然后选择重启手表。 将手表重置为出厂设置 如重启手表不起作用,您可以将手表重置为出厂设置。请注意将手表重置为出厂设置,会将手表上的所有个人数据与设置清空,您需要重新设置手表才可供您个人使用。您从手表同步至 Flow 账户上的所有数据均

  • 自增 和自减 都是一元运算符,它的前置形式和后置形式都可以被重载。请看下面的例子: 运行结果: s1: 00:00 s2: 00:01 s1: 00:01 s2: 00:01 上面的代码定义了一个简单的秒表类,m_min 表示分钟,m_sec 表示秒钟,setzero() 函数用于秒表清零,run() 函数是用来描述秒针前进一秒的动作,接下来是三个运算符重载函数。 先来看一下 run() 函数的实

  • 主要内容:重载输入运算符>>,重载输出运算符<<,综合演示在 C++中,标准库本身已经对左移运算符 和右移运算符 分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面

  • 本文向大家介绍重载和重写的区别?相关面试题,主要包含被问及重载和重写的区别?时的应答技巧和注意事项,需要的朋友参考一下 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。 重载发生在一个类中,同名的方法如果有不同的参数列表(类型不同、个数不同、顺序不同)则视为重载。 重写发生在子类与父类之间,重写要求子类重写之后的方法与父类被重写方法有相同的返回

  • 问题内容: 这个问题已经在这里有了答案 : atomic / volatile / synchronized有什么区别? (7个答案) 11个月前关闭。 我知道允许可见性,允许原子性。因此,如果我使用volatile ,是否意味着我不必再使用任何同步机制了? 例如。 这是线程安全的吗? 问题答案: 我相信这实际上会 同时带来 原子性和波动性。因此,当您致电(say)时,可以保证获得 最新的 价值。

  • “编写一个名为clsWorker的超类和子类clsHourlyWorker和clssalariedworker。每个工人都有一个名字和一个工资率。编写计算每个员工周薪的方法computePay(int hours)。小时工按实际工作小时数获得小时工资,如果小时数最多为40小时。如果小时工工作超过40小时,则按时间半支付超出部分。受薪工人得到40小时的小时工资,无论实际小时数是多少。为继承编写一个测