2017-01-14 105 views
0

我使用Spring AOP的註釋值,我怎樣才能從註釋值, 這裏是我的註解:Spring AOP中獲得

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
@Inherited 
@Documented 
public @interface ExecutionMethodProfiler 
{ 
    String value() default "defaultValue";; 
} 

這裏是我的XML:

<aop:aspectj-autoproxy/> 
    <aop:config> 
     <aop:aspect ref="methodProfiler"> 
      <aop:pointcut id="serviceMethod" 
       expression="(execution(* com.old..*(..)) or execution(* com.test..*(..))) and @annotation(com.test.profiler.ExecutionMethodProfiler)" /> 
      <aop:around pointcut-ref="serviceMethod" method="profile"/> 
     </aop:aspect> 
    </aop:config> 

這是我的服務方法:

public void profile(ProceedingJoinPoint jointPoint) throws Throwable {} 

截至目前我可以通過使用此代碼獲取值:

MethodSignature signature = (MethodSignature) jointPoint.getSignature(); 
System.out.println(signature.getMethod().getAnnotation(ExecutionMethodProfiler.class).value()); 

我不喜歡它,有沒有更好的方法?

回答

0

首先改變你的意見,把你的註釋作爲一個額外的參數:

public void profile(
    ProceedingJoinPoint jointPoint, 
    ExecutionMethodProfiler methodProfiler 
) throws Throwable {} 

然後註釋綁定到你的切入點這樣的說法:

<aop:around 
    pointcut="(execution(* com.old..*(..)) or execution(* com.test..*(..))) and @annotation(methodProfiler)" 
    method="profile" 
    arg-names="methodProfiler" 
/> 

我沒有實際測試它,因爲我現在有點忙,但基本上它是如何工作的。

+0

我試了一下,我得到的錯誤: 嵌套的異常是java.lang.IllegalArgumentException:錯誤:: 0正式無約束在切入點 – Breakidi

+0

我已更新我的答案,以便在方法簽名中有第一個連接點參數。在AspectJ中,它可以是第一個或最後一個參數,但也許Spring在這裏更挑剔。此外,請確保參數名稱在任何地方都一樣:切入點,參數名稱和方法簽名。否則它不能被綁定。 – kriegaex

+0

如果我更新方法簽名薄,我得到這個異常: 構造函數拋出異常;嵌套異常是java.lang.IllegalStateException:期望在通知中找到2個通過名稱綁定的參數,但實際上找到1個參數。 – Breakidi