2014-11-02 708 views
0

我的班級:Spring AOP:如何攔截內部類?

@Aspect 
public class ServiceAspect { 
    @Before("execution(public * com.test.server.support.service.*.Client.*(..))") 
    public void before(JoinPoint joinPoint) { 
     System.out.println("...."); 
    } 
} 

春天-config.xml中內容只有:

<context:annotation-config/> 

爲spring-servlet.xml:

<mvc:annotation-driven/> 
<mvc:default-servlet-handler/> 

<context:component-scan base-package="com.test.client.support"> 
    <context:include-filter type="aspectj" expression="com.test.client.support.aspect.ServiceAspect"/> 
</context:component-scan> 
<context:component-scan base-package="com.test.manager"/> 

<aop:aspectj-autoproxy proxy-target-class="true"/> 

我希望通過這種方式,然後可xxx.Client各班以下方法調用時,連接會自動創建。

當項目目前運行時,AOP無響應。客戶端類是自動生成的節儉IDL:

但是,如果theBefore

("execution (public * com.test.server.support.service.*.Client.*(..))") 

IntoPointcut

("@within (org.springframework.stereotype.Controller)") 

,你可以方法

注意之前進入。

+0

有了這個描述真的很難說這個問題,但我有一個問題:你能告訴我具體的,完全合格的類名稱你想攔截的方法嗎?這些類是否直接在'com.test.server.support.service'包中?下面是一個分包?二?更多? – kriegaex 2014-11-03 11:11:37

+0

com.test.server.support.service有許多類,每個類都有一個內部的Client類。我想截取所有的客戶端下的方法(com.test.server.support.service.Role.Client。客戶端是內部類的角色) – Mingjian 2014-11-04 01:45:56

+0

對於我來說,不管客戶端是靜態的還是非靜態的內部類,這都是有效的。儘管我嘗試了純粹的AspectJ,而不是Spring AOP。但切入點語法和匹配算法應該是相同的。所以除非你有Spring配置問題,否則我不知道問題會出在哪裏。也許你可以通過發佈包含內部類的'Role'源代碼來更新問題。不要忘記包名稱和導入。請將這兩個添加到該方面。 – kriegaex 2014-11-04 12:36:26

回答

2

Spring AOP只能用於聲明爲Spring Beans的類的公共方法。我猜你的內部類可能不是Spring Beans。因此,無論你應該

  • 重構代碼,以擺脫內部類或
  • 讓你的內部類的Spring bean或Spring AOP的,以完整的AspectJ
  • 開關(的<context:load-time-weaver/>代替<aop:aspectj-autoproxy/>),見Spring documentation, chapter 9.8

更新:within()切入點AspectJ中也包括內部類,這是記錄。如果和如何也適用於Spring AOP,我不知道。