0

我希望我在 Roo 项目中的第一个方面能够在 Web 控制器启动时运行建议。但我无法让切入点匹配。

控制器有一个以 Cfx 开头的类名。我尝试过以下形式:

pointcut setBrand() : initialization(Cfx*.new (..));

before()  : setBrand()
{
    log.info("xxxxxxxxxxxx  setting brand");
}

除了“初始化”之外,我还尝试过(来自 AspectJ Cookbook)调用(签名)新关键字、预初始化、静态初始化。公式是什么?

也许这是相关的 - Roo 方面没有这种形式 - 例如没有切入点。他们是如何工作的?这是在哪里记录的?

谢谢

PS道歉,这是一个重新发布。我将此发布到 Spring Roo 论坛,但没有得到回应。http://forum.springsource.org/showthread.php?129374-Aspect-to-trap-Controller-creation-how-to

4

1 回答 1

1

我对 Roo 或 Spring 几乎一无所知,只知道一些 AspectJ,所以我将仅从 AspectJ 的角度回答您的问题,假设您是 AOP 新手(对不起,如果我的假设不正确):

  • 如果您想在加载类时执行某些操作,请使用staticinitialization(TypePat)切入点。
  • 如果您想在创建对象(实例)时执行某些操作,请使用类似execution(ConstructorPat). 这initialization是用于特殊目的,并且preinitialization很少需要。我假设第一个会为你做,不知道你的确切目的。
  • 进一步假设类似execution(Cfx*.new (..))的东西基本上是您想要的东西,我建议您查看可能的错误或警告,例如“...中定义的建议尚未应用 [Xlint:adviceDidNotMatch]”,因为它可能只是一个切入点匹配问题。请注意,您使用的类型模式假定匹配的构造函数与切面在同一个包中,并且它们具有标准的可见性(不是公共的或其他任何东西)。因此,除非存在类加载问题,否则您可能只想更准确地(或更一般地)指定要匹配的内容。例子:
    • com.bigboxco.my_app.Cfx*.new(..)
    • com.bigboxco..Cfx*.new(..)
    • public com.bigboxco..Cfx*.new(..)
    • !private com.bigboxco..Cfx*.new(..)
    • * com.bigboxco..Cfx*.new(..)

一个好的策略可能是尝试通过复制其确切签名并使用其完全限定的类名来匹配您的构造函数,然后从该点开始使其更通用。

更新:我知道您可以自己进行网络搜索,但无论如何这里有一些有用的链接:

于 2012-08-20T06:28:15.163 回答