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:
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;
. 02
importazione
java.lang.annotation.Retention;
03.
importazione
java.lang.annotation.RetentionPolicy;
. 04
importazione
java.lang.annotation.Target;
05.
06.
@ Retention
(RetentionPolicy.RUNTIME)
07.
@ Target
(ElementType.METHOD)
08.
pubblici
@ interfaccia
TestAnnotation {
09.
String value ();
10.
}
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 di
lima
[/ Java_Projects2/Tips/marin-tips-spring-3/src/main/resources/example10_beforeadvice.xml]
04.
13:54:10,939 DefaultListableBeanFactory INFO: 555 - Pre-istanze singleton
in
org.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,
3.
RequestMethod requestMethod) {
Nessun commento:
Posta un commento
Nota. Solo i membri di questo blog possono postare un commento.