2015-03-22 27 views
5

Sto studiando il modulo Spring AOP e ho qualche dubbio su come funziona esattamente la consulenza AROUND.Come funziona esattamente un consiglio @Around in Spring AOP?

Leggendo la documentazione ufficiale: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

posso leggere questo circa il INTORNO UN CONSIGLIO:

Intorno consiglio: Consigli che circonda un punto di unirsi, come un metodo di invocazione. Questo è il tipo più potente di consiglio. Intorno al consiglio è possibile eseguire un comportamento personalizzato prima e dopo l'invocazione del metodo. Lo strumento è inoltre responsabile della scelta di procedere al punto di join o di eseguire il collegamento all'esecuzione del metodo consigliato restituendo il proprio valore di ritorno o generando un'eccezione.

E questo è il diagramma di sequenza dei consigli in giro:

enter image description here

Quindi, da quello che posso capire posso definire un consiglio (il mio comportamento personalizzato) che eseguirà prima e dopo una punto congiunto specificato da pointcut.

Così, per esempio posso definire un INTORNO UN CONSIGLIO in questo modo:

@Around(“execution(@example.Cacheable * rewards.service..*.*(..))”) 
public Object cache(ProceedingJoinPoint point) throws Throwable { 
    Object value = cacheStore.get(cacheKey(point)); 

    if (value == null) { 
     value = point.proceed(); 
     cacheStore.put(cacheKey(point), value); 
    } 
    return value; 
} 

che eseguono il comportamento chaching attuate prima e dopo che un metodo di servizio è chiamata. È giusto?

La cosa che non riesco a capire è esattamente come è e come viene utilizzato il parametro ProceedingJoinPoint point.

Da quello che ho capito, viene utilizzato per scegliere se eseguire o non eseguire un'operazione specifica ma come funziona esattamente?

Un altro dubbio riferito come utilizzare correttamente consiglio AOP è come rispondere alla seguente domanda:

Quale consiglio devo usare se vorrei cercare di catturare eccezioni?

ritengo che in questo caso la risposta è utilizzare il Dopo aver gettato consigli perché il consiglio eseguito quando sono appaiate uscite metodo di esecuzione da un'eccezione.

Ma non ne sono sicuro perché da quello che ho capito il consiglio viene eseguito solo se un metodo genera un'eccezione. O forse in questo caso devo usare il ** AROUND ADVICE *?

Tnx

+1

Mentre sta sicuramente dimostrando le buone intenzioni di "studiare" Spring AOP, la tua scrittura di elaborati trattati teorici non ti porterà molto lontano nel comprendere l'argomento. La mia raccomandazione è di scrivere effettivamente il codice e basta dare una prova alle teorie per scoprire se hanno ragione o torto. La tua domanda è così elaborata, nel frattempo avresti potuto scoprirlo provando davvero. – kriegaex

risposta

4

In realtà tutte quelle annotazioni AOP sono esposti come attuazione concreta di AbstractAspectJAdvice.E anche se è @AfterThrowing, la sua AspectJAfterThrowingAdvice c'è e invocato in ogni caso:

try { 
    return mi.proceed(); 
} 
catch (Throwable t) { 
    if (shouldInvokeOnThrowing(t)) { 
     invokeAdviceMethod(getJoinPointMatch(), null, t); 
    } 
    throw t; 
} 

Il @Around ha davvero più potere e fornisce un maggiore controllo per l'utente finale per ottenere che fare con ProceedingJoinPoint.

È necessario studiare tutti questi tipi di consigli, ma con @Around è possibile raggiungerli tutti, anche se non si deve dimenticare di chiamare mi.proceed() da lì. Se è necessario farlo secondo la tua logica, ovviamente.