在Roo项目中捕获控制器创建的方面 - 如何?

时间:2012-08-19 15:41:03

标签: spring aop spring-roo

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

控制器的类名称以Cfx开头。我尝试过以下表格:

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

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

以及"初始化"我尝试过(使用AspectJ Cookbook一书)调用(Signature)新关键字,preinitialization,staticinitialization。公式是什么?

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

由于

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

1 个答案:

答案 0 :(得分: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(..)

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

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