venerdì 23 settembre 2011

Il supporto di AspectJ Primavera e la prima annotazione


Potrebbe essere chiesti come i ragazzi della Primavera fare tutto ciò che jiggery-pokery con le annotazioni che si aggiunge ai vostri fagioli primavera. Io non sono un esperto qui, ma ho il sospetto che da qualche parte lungo la strada, fanno un po 'di Aspect Oriented Programming utilizzando AspectJ - dopo tutto, essi hanno un supporto completo per esso. Questo naturalmente è supposizione totale - non sono stato pesca a strascico attraverso il loro codice sorgente. Questo blog dimostra come è possibile utilizzare AspectJ per intercettare i metodi annotata la classe e per farlo, ho intenzione di dimostrare l'@ Prima annotazione scrivendo una classe prima di Consigli che prende un picco a gli attributi di annotazioni di un metodo. Questo blog si basa sul mio blog precedente AspectJ che dimostra come scrivere un consiglio dopo aver lanciato .

La prima cosa che abbiamo davvero bisogno è una annotazione. Qualsiasi cosa va bene, e ho scritto un semplice TestAnnotation @ come dimostrato di seguito. Questo è un attributo: valore:
01.importazione java.lang.annotation.ElementType;
. 02importazione java.lang.annotation.Retention;
03.importazione java.lang.annotation.RetentionPolicy;
. 04importazione java.lang.annotation.Target;
05. 
06.@ Retention (RetentionPolicy.RUNTIME)
07.@ Target (ElementType.METHOD)
08.pubblici @ interfaccia TestAnnotation {
09.String value ();
10.}
Questa annotazione può quindi essere applicato a qualsiasi metodo nell'applicazione - scegli-uno a caso qui come l'annotazione in realtà non fare nulla:

01.pubblici classe MySimplePrintln {
02. 
03./ **
04.* Stampa un messaggio
05.* /
06.@ TestAnnotation (valore = "Roger" )
07.pubblici void println (String arg0) {
08.System.out.println (arg0);
09.}
10.}

Alla classe successiva è il cuore della questione. E 'un consiglio prima che controlla l'esecuzione di qualsiasi metodo, che è annotato con @ TestAnnotation come dimostrato nel frammento qui sotto:
1.@ Prima "esecuzione (* *.*(..)) & & annotazione @ (testAnnotation)" )
2.pubblici vuoto myBeforeLogger (JoinPoint joinPoint, testAnnotation TestAnnotation) {

Il mio blog precedente esplorato l'esecuzione () espressione nel dettaglio, tuttavia, la cosa da notare qui è che è combinato con l'annotazione espressione: annotazione @ (testAnnotation) in modo da creare il corretto metodo di filtraggio. La prossima cosa da notare è che l'annotazione è passato al myBeforeLogger (..) come argomento. Questo ci permette di entrare in possesso degli attributi della nota come dimostrato nel codice sorgente completo metodo di seguito:

01.@ Aspect
02.pubblici classe BeforeAdvice {
03. 
04./ / Ottiene un logger adatto.
05.private static Logger log = LogFactory.getLog (BeforeAdvice. classe );
06. 
07.@ Prima "esecuzione (* *.*(..)) & & annotazione @ (testAnnotation)" )
08.pubblici vuoto myBeforeLogger (JoinPoint joinPoint, testAnnotation TestAnnotation) {
09. 
10.System.out.println ( "Va bene - siamo nella prima gestore di ..." );
11.System.out.println ( "Il valore annotazione di prova è:" + testAnnotation.value ());
12. 
13.Signature = firma joinPoint.getSignature ();
14.String methodName = signature.getName ();
15.roba String = signature.toString ();
16.String argomenti = Arrays.toString (joinPoint.getArgs ());
17.logger.info ( "Scrivi qualcosa nel registro ... Siamo sul punto di chiamata di metodo:"
18.methodName + + "con gli argomenti" + argomenti + "\ ne toString pieno:"
19.roba +);
20. 
21.}
22. 
23.}

Quindi, non solo è possibile accedere agli argomenti di un metodo, prima si chiama, è anche possibile accedere agli attributi sua annotazione, che mi sembra uno strumento piuttosto potente. Avrete bisogno anche di un file di configurazione primavera e del codice di caricarlo, ma sono ve coperto che nel mio blog precedente su Spring e AspectJ, in modo da dare uno sguardo qui per maggiori informazioni. L'unico punto chiave qui è che è necessario includere la riga:

1.AOP: aspectj-proxy automatico />

. ... Da qualche parte nel file di configurazione di esecuzione di questo codice di cui sopra produrrà il seguente output:



01.Questo è il gestore di prima
02.13:54:10,110 FileSystemXmlApplicationContext INFO: 456 - Rinfrescante org.springframework.context.support.FileSystemXmlApplicationContext @ 7a3570b0: avvio data [mer 17 ago 13:54:10 CEST 2011]; radice della gerarchia di contesto
03.13:54:10,262 XmlBeanDefinitionReader INFO: 315 - Caricamento XML definizioni fagiolo dilima [/ Java_Projects2/Tips/marin-tips-spring-3/src/main/resources/example10_beforeadvice.xml]
04.13:54:10,939 DefaultListableBeanFactory INFO: 555 - Pre-istanze singleton inorg.springframework.beans.factory.support.DefaultListableBeanFactory @ 30296f76: fagioli definizione [org.springframework.aop.config.internalAutoProxyCreator, beforeHandler, MainClass, println] ; radice della gerarchia di fabbrica
05.Ok - siamo nel gestore di prima ...
06.Il test di valore annotazione è: Roger
07.13:54:11,790 BeforeAdvice INFO: 43 - Scrivi qualcosa nel registro ... Siamo sul punto di chiamata di metodo: println con argomenti [Qualcosa di stampare ...]
08.e il pieno toString: example_10_annotations.before_annotation_annotation.MySimplePrintln.println void (String)
09.Qualcosa da stampare ...
10.fine ...

Infine, c'è di più. Dato che di default l'attributo @ Prima è espressione, è possibile applicare più di una annotazione per il metodo di consigli:

1.@ Prima "esecuzione (* *.*(..)) & & annotazione @ (testAnnotation) annotazione @ (requestMethod)" )
2.pubblici vuoto myBeforeLogger (JoinPoint joinPoint, testAnnotation TestAnnotation,

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.