English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Esempio di configurazione xml di AOP Spring AspectJ

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 returningApplica 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 throwingApplica se il metodo della logica del business reale lancia un'eccezione.
Attenzione: Per comprendere il concetto di aop e i suoi vantaggi, visita qui. Tutorial di concetto AOP

1、aop: before

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.java
package 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.


2. Esempio di aop: dopo

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.


3. Esempio di aop: dopo il ritorno

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.


4, aop: around

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.


5、aop: after-throwing

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