2011-10-31 54 views
0

我在這個類中有一個Class,稱之爲X,我已經成功地建議了一個方法從Annotated Spring調用它的method(){}。從已經在Spring中建議的方法中觸發第二個建議的方法

所以,在這裏,它是:

public class X { 
    public void method(){...} 
    public void method2(){...} 
} 

這裏是我的方式,縮短課程:

@Aspect 
public class MyAspect{ 
    @Pointcut("execution(* X.method(..))") 
    public void methodJP(){} 

    @Pointcut("execution(* X.method2(..))") 
    public void method2JP(){} 

    @Around("methodJP()") 
    public void doMethodJP(ProceedingJoinPoint pjp) throws Exception { 
     pjp.proceed(); //Amongst other things!!! 
    } 

    @After("method2JP()") 
    public void doMethod2JP(JoinPoint jp) throws Exception { 
     //Do some stuff here 
    } 
} 

現在......兩個連接點,我十之內很好地工作,但是,我方法,我也調用method2JP()建議的方法...當然,我的method2JP不會被觸發。

有什麼辦法可以讓這個工作?

謝謝。

回答

1

由於Spring AOP通過代理類工作,對於要調用的通知,您必須通過bean工廠提供的代理或包裝來調用方法。

如果您不想分成多個類,可以讓該方法從beanfactory中檢索代理版本的「自身」。這樣

@Service 
public class MyService { 
    @Autowired 
    ApplicationContext context; 

    public void method1() { 
     context.getBean(MyService.class).method2(); 
    } 

    public void method2() { 
    } 

} 

這東西將保證方法2,從方法1調用將適用於方法2切入點任何方面。

+0

我喜歡它......讓我給它「旋轉」! –

+0

我覺得貧民窟這樣做,但它的工作。謝謝! –

+1

是的,它完全是貧民窟。更重要的是,它打破了AOP的全部想法,因爲它迫使你修改你建議的代碼。它的工作原理(我自己也用過幾次「黑客」),但將第二種方法分解成另一個bean可能更優雅。它是凝聚力/碎片化以及符合Springs限制的平衡。但就像有人說,如果它有效,它很漂亮... – pap

1

methodJP()應該在另一個類中聲明。在常規場景中,當您從同一對象內調用方法時,不會觸發這些方面。

+0

謝謝,我很害怕這種情況。 –