English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring ti permette di definire aspetti, consigli e punti di intersezione nei file xml.
Nella pagina precedente, abbiamo visto un esempio di aop con annotazioni. Ora, vedremo lo stesso esempio tramite file di configurazione xml.
Vediamo gli elementi xml utilizzati per definire i consigli.
aop: before
Applica prima della chiamata al metodo della logica del business reale.
aop: after
Applica dopo la chiamata al metodo della logica del business reale.
aop: after returning
Applica dopo la chiamata al metodo della logica del business reale. Puoi intercettare il valore di ritorno delle notifiche.
aop: around
Applica prima e dopo la chiamata al metodo della logica del business reale.
aop: after throwing
Applica se il metodo della logica del business reale lancia un'eccezione.
Applicare "consigli AspectJ precedenti" prima del metodo della logica del business. Puoi eseguire qualsiasi operazione qui, ad esempio conversione, autenticazione ecc.
Creare una classe che contiene la logica del business.
File: Operation.javapackage com.w3codebox; public class Operation{ public void msg(){System.out.println("msg method invoked");} public int m(){System.out.println("m method invoked");return 2;} public int k(){System.out.println("k method invoked");return 3;} }
Ora create la classe dell'aspetto che contiene l'avviso prima.
File: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; public class TrackOperation{ public void myadvice(JoinPoint jp)//è un avviso { System.out.println("preoccupazione aggiuntiva"); //System.out.println("Method Signature: " + jp.getSignature()); } }
Ora create il file applicationContext.xml che definisce il bean.
File: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd > <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @Before --> <aop:pointcut id="pointCutBefore" espressione="execution(* com.w3codebox.Operation.*(..))" /> <aop:before method="myadvice" pointcut-ref="pointCutBefore" /> </aop:aspect> </aop:config> </beans>
Ora chiamiamo il metodo reale.
File: Test.java
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext contesto = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("chiamando msg..."); e.msg(); System.out.println("Chiamando m..."); e.m(); System.out.println("Chiamando k..."); e.k(); } }
Output
chiamando msg... preoccupazione aggiuntiva msg() method invoked Chiamando m... preoccupazione aggiuntiva Chiamato metodo m() Chiamando k... preoccupazione aggiuntiva Chiamato metodo k()
Come potete vedere, prima di chiamare i metodi msg(), m() e k(), vengono stampati altri problemi.
Dopo aver chiamato il metodo della logica aziendale reale, viene applicato l'AspectJ dopo l'avviso. Può essere utilizzato per mantenere i log, la sicurezza, le notifiche, ecc.
Supponiamo qui
Operation.java
,
TrackOperation.java
e
Test.java
Il file è lo stesso dell'esempio di aop:
Ora create il file applicationContext.xml che definisce il bean.
File: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd > <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @After --> <aop:pointcut id="pointCutAfter" espressione="execution(* com.w3codebox.Operation.*(..))" /> <aop:after method="myadvice" pointcut-ref="pointCutAfter" /> </aop:aspect> </aop:config> </beans>
Output
chiamando msg... msg() method invoked preoccupazione aggiuntiva Chiamando m... Chiamato metodo m() preoccupazione aggiuntiva Chiamando k... Chiamato metodo k() preoccupazione aggiuntiva
Vedete che dopo aver chiamato i metodi msg(), m() e k(), possono sorgere altri problemi.
Utilizzando il ritorno delle raccomandazioni dopo, possiamo ottenere i risultati delle raccomandazioni.
Creazione
File: Operation.java
package com.w3codebox; public class Operation{ public int m(){System.out.println("m() method invoked");return 2;} public int k(){System.out.println("k() method invoked");return 3;} }
Creare la classe dell'aspetto inclusa nel consiglio di ritorno.
File: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; public class TrackOperation{ public void myadvice(JoinPoint jp,Object result)//è un consiglio (consiglio dopo) { System.out.println("preoccupazione aggiuntiva"); System.out.println("Firma del metodo: "+jp.getSignature()); System.out.println("Risultato nel consiglio: "+result); System.out.println("Fine del consiglio di ritorno dopo l'operazione..."); } }
File: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd > <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @AfterReturning --> <aop:pointcut id="pointCutAfterReturning" espressione="execution(* com.w3codebox.Operation.*(..))" /> <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" /> </aop:aspect> </aop:config> </beans>
File: Test.java
Ora viene creato il Test della classe che chiama il metodo reale.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext contesto = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation e = (Operation) context.getBean("opBean"); System.out.println("Chiamando m..."); System.out.println(e.m()); System.out.println("Chiamando k..."); System.out.println(e.k()); } }
Output
Chiamando m... Chiamato metodo m() preoccupazione aggiuntiva Firma del metodo: int com.w3codebox.Operation.m() Risultato nel consiglio: 2 Fine del consiglio di ritorno dopo l'operazione... 2 Chiamando k... Chiamato metodo k() preoccupazione aggiuntiva Firma del metodo: int com.w3codebox.Operation.k() Risultato nel consiglio: 3 Fine del consiglio di ritorno dopo l'operazione... 3
Puoi vedere che il valore di ritorno viene stampato due volte, una volta stampata dalla classe TrackOperation e la seconda volta dalla classe Test.
Suggerito intorno a AspectJ applicare prima e dopo l'invocazione del metodo logica aziendale reale.
Creare una classe
File: Operation.java
package com.w3codebox; public class Operation{ public void msg(){System.out.println("msg() is invoked");} public void display(){System.out.println("Viene chiamato display()");} }
Creare una classe di lato che contiene il consiglio circondante.
Devi passare in advice metodo
PreceedingJoinPoint
Riferimento, in modo che possiamo chiamare il metodo proceed().
File: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.ProceedingJoinPoint; public class TrackOperation { public Object myadvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("Preoccupazione aggiuntiva prima della chiamata al metodo effettivo"); Object obj=pjp.proceed(); System.out.println("Preoccupazione aggiuntiva dopo la chiamata al metodo effettivo"); return obj; } }
File: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd > <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @Around --> <aop:pointcut id="pointCutAround" espressione="execution(* com.w3codebox.Operation.*(..))" /> <aop:around method="myadvice" pointcut-ref="pointCutAround" /> </aop:aspect> </aop:config> </beans>
File: Test.java
Ora viene creato il Test della classe che chiama il metodo reale.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext context = new classPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); op.msg(); op.display(); } }
Output
Preoccupazione aggiuntiva prima della chiamata al metodo effettivo Viene chiamato msg() Preoccupazione aggiuntiva dopo la chiamata al metodo effettivo Preoccupazione aggiuntiva prima della chiamata al metodo effettivo Viene chiamato display() Preoccupazione aggiuntiva dopo la chiamata al metodo effettivo
Puoi vedere che prima e dopo la chiamata a msg() e la visualizzazione del metodo, vengono stampati anche altri problemi.
Utilizzando il suggerimento after-throwing, possiamo stampare l'eccezione nel metodo TrackOperation. Vediamo un esempio di suggerimento AspectJ AfterThrowing.
Creare la classe contenente la logica aziendale.
File: Operation.java
package com.w3codebox;
public class Operation{
public void validate(int age)throws Exception{
if(age<18){
throw new ArithmeticException("Non è un'età valida");
}
else{
System.out.println("Grazie per il voto");
}
}
}
Creare la classe dell'aspetto contenente l'avviso dopo il lancio dell'avviso.
In questo caso, dobbiamo passare un riferimento a Throwable per poter intercettare l'eccezione qui.
File: TrackOperation.java
package com.w3codebox; import org.aspectj.lang.JoinPoint; public class TrackOperation{ public void myadvice(JoinPoint jp,Throwable error)//è un avviso { System.out.println("preoccupazione aggiuntiva"); System.out.println("Firma del metodo: "+jp.getSignature()); System.out.println("L'eccezione è: "+error); System.out.println("fine dell'avviso dopo il lancio dell'eccezione..."); } }
File: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd > <aop:aspectj-autoproxy /> <bean id="opBean" class="com.w3codebox.Operation"> </bean> <bean id="trackAspect" class="com.w3codebox.TrackOperation"></bean> <aop:config> <aop:aspect id="myaspect" ref="trackAspect" > <!-- @AfterThrowing --> <aop:pointcut id="pointCutAfterThrowing" espressione="execution(* com.w3codebox.Operation.*(..))" /> <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" /> </aop:aspect> </aop:config> </beans>
File: Test.java
Ora viene creato il Test della classe che chiama il metodo reale.
package com.w3codebox; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ public static void main(String[] args){ ApplicationContext contesto = new ClassPathXmlApplicationContext("applicationContext.xml"); Operation op = (Operation) context.getBean("opBean"); System.out.println("chiamare validate..."); try{ op.validate(19); }catch(Exception e){System.out.println(e);} System.out.println("chiamare validate di nuovo..."); try{ op.validate(11); }catch(Exception e){System.out.println(e);} } }
Output
chiamare validate... Grazie per il voto chiamare validate di nuovo... preoccupazione aggiuntiva Firma del metodo: void com.w3codebox.Operation.validate(int) L'eccezione è: java.lang.ArithmeticException: Età non valida ...fine dell'avviso dopo aver lanciato un'eccezione... java.lang.ArithmeticException: Età non valida