2010-05-04 16 views
9

Tamamen ayrı olan ve sistemin farklı bölümleri için dokunacak olan iki Spring AOP noktası oluşturdum. Nokta kesimleri, iki farklı tavsiye çevresinde kullanılır, bu öneriler, aynı Java yöntemine işaret eder.Spring aop çok noktalı işaretler ve öneriler var ama sadece sonuncu çalışıyor

xml dosyası görünüyor nasıl:

<aop:config> 
    <aop:pointcut expression="execution(......)" id="pointcutOne" /> 
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" /> 

    <aop:aspect id="..." ref="springBean"> 
     <aop:around pointcut-ref="pointcutOne" method="commonMethod" /> 
     <aop:around pointcut-ref="pointcutTwo" method="commonMethod" /> 
    </aop:aspect> 
</aop:config> 

sorun olduğunu sadece son pointcut işleri (sonuncusu olduğu için düzeni pointcutOne eser değiştirirseniz). Bir büyük nokta kesiti oluşturarak işe koyuldum ama onları ayırmak istiyorum. Bir nokta noktasından sadece birinin neden çalıştığına dair herhangi bir öneriniz var mı?

+0

Sanırım aop: aroung' sadece sorudaki bir yazım hatasıdır. – Bozho

+0

evet, bunun için üzgünüm. –

cevap

6

<aop:aspect> öğesinin içinde yer işaretini ve önerileri almayı deneyin. Böyle bir şey:

<aop:config> 
    <aop:aspect id="aspect1" ref="springBean"> 
    <aop:pointcut expression="execution(......)" id="pointcutOne" /> 
    <aop:around pointcut-ref="pointcutOne" method="commonMethod" /> 
    </aop:aspect> 

    <aop:aspect id="aspect2" ref="springBean"> 
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" /> 
    <aop:around pointcut-ref="pointcutTwo" method="commonMethod" /> 
    </aop:aspect> 
</aop:config> 

Ben iki vekil nesneleri olmalıydı sırasında XML yapılandırma, sadece bir vekil nesne sonuçlandı sanırım.


Btw: yerine @AspectJ sözdizimi kullanarak düşünmelisiniz. Bu sadece ek açıklamalarda nokta ve önerileri ile Java. Spring AOP ile iyi çalışır ve XML alternatifinden daha fazla işlevsellik sunar.

Bahar AOP ile @AspectJ yönlerini etkinleştirmek için yapılandırma gereken tek şey: Güncellendi

@Aspect 
public class Aspect1 { 

    @Pointcut("execution(* *(..))") 
    public void demoPointcut() {} 

    @Around("demoPointcut()") 
    public void demoAdvice(JoinPoint joinPoint) {} 
} 

:

Örnek böyle bir şey olabilir

<aop:aspectj-autoproxy> 
    <aop:include name="aspect1" /> 
    <aop:include name="aspect2" /> 
</aop:aspectj-autoproxy> 

<bean id="aspect1" class="com.demo.Aspect1"/> 
<bean id="aspect2" class="com.demo.Aspect2"/> 

Ve Aspect Bu, diğer üç noktayı birleştirmek için bir nokta kesiti kullanır:

@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " + 
    "&& notSetMethodsInTraceDemoPackage()") 
public void filteredTraceMethodsInDemoPackage() {} 
+0

Aynı problem, bu çok garip. Sadece bir noktaya sahip olduğumda işe yaramaz, ancak çok hızlı bir şekilde büyür. Ek açıklama kullanma önerileri için teşekkür ederiz. Xml kullanmanın daha iyi bir çözüm olduğunu size tamamen katılıyorum. Xml'ye ek olarak ek açıklamalar olarak da benzer noktalara sahibim, ancak xml'yi de desteklemek istedim çünkü ana projenin yeniden derlenmeden yönlerini değiştirmesini mümkün kılacak. –

+0

Bu garip. Proxy nesneleri, katılma noktanız tarafından önerilen yöntemden önce ve sonra tekrarlı olarak çağrılmalıdır. Bir nokta işaretiyle çalışıyorsa, ilk ikisini birleştiren ve bunu etraftaki öğütlerde kullanan üçüncü bir nokta kesimi oluşturabilirsiniz. – Espen

+0

Ek açıklamaları kullanmak harika çalışıyor, bu yüzden ben xml yerine bunu kullanmak için en az özelliklerden birini güncellemeyi düşünüyorum. Sadece değişiklik yapmak için yeniden derlememiz gerektiğinin farkında olmalıyız. Yardımın için teşekkürler! –