2012-06-25 50 views
1

我想在觸發另一個類的特定方法時觸發一個方法,這就是爲什麼我想要使用@Pointcut。Spring AOP @Pointcut不觸發

下面的代碼幾乎與我編碼的代碼完全相同,我不需要添加其他代碼。

public class OrgManagerImpl implements OrgManager { 
    public IOrg getOrg(String orgShortName) { 
    } 
} 

,這是一個將要被觸發類:

@Aspect 
public class OrgManagerSynchronizer { 

    @Pointcut("execution(* com.alvin.OrgManager.getOrg(..))") 
    public void classMethods() {} 

    @Before("classMethods()") 
    public void synchronize(JoinPoint jp) { 
     //code should be executed. but does not execute. 
    } 
} 

,在我的.xml這是規定:

aop:aspectj-autoproxy 

更重要的是我要補充?接下來做什麼?

+0

每次我調試代碼,它跳過AOP部分直接進入getOrg(); – Alvin

+0

您是否在'component:scan'中添加了'OrgManagerSynchronizer'? – xyz

+0

你可以發佈你的XML配置?請檢查OrgManagerImpl是否是一個Spring bean。 –

回答

0

檢查下面的東西。

1)檢查OrgManagerImpl是否在上下文xml中定義爲bean,或者在上下文xml中標記爲@Component &或您的類包。

2)如果上述的事情是正確的,那麼試着改變切入點如下

@Pointcut("execution(* get*(..))") 

這個切入點攔截所有get方法。看看用這一點削減你的同步方法是否奏效。如果它有效,那麼至少你的彈簧配置是好的。你只需要改進切入點表達式。但是,如果這也行不通,那麼你的彈簧aop配置本身就有問題,所以我們可以專注於這些配置。

此外,如果這不工作,然後嘗試給一些更多的信息像你這樣的背景下XML,豆Java類等,則需要檢查

0

兩件事情。

  1. AOP:AspectJ的自動代理在配置
  2. 啓用點剪切/縱橫/目標是彈簧豆

的下面是我的XML配置示例。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 

    <aop:aspectj-autoproxy/> 
    <context:component-scan base-package="com.techoffice"/> 

    <bean class="com.techoffice.example.ExampleAspect"/> 

</beans> 

ExampleAspect.java

package com.techoffice.example; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class ExampleAspect { 

    @Pointcut("execution (* com.techoffice..*(..))")   
    public void anyRun() {} 

    @Before(value="anyRun()") 
    public void beforeAnyRun(JoinPoint jointPoint){ 
     System.out.println("Before " + jointPoint.getClass().getName() + "." + jointPoint.getSignature().getName()); 
    } 

    @After(value="anyRun()") 
    public void afterAnyRun(JoinPoint jointPoint){ 
     System.out.println("After " + jointPoint.getClass().getName() + "." + jointPoint.getSignature().getName()); 
    } 
} 

HelloWorldExample

package com.techoffice.example; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.stereotype.Component; 

@Component 
public class HelloWorldExample { 

    public void run(){ 
     System.out.println("run"); 
    } 

    public static void main(String[] args){ 
     ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 
     HelloWorldExample helloWorldExample = context.getBean(HelloWorldExample.class); 
     helloWorldExample.run(); 
    } 
}