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

Spring AOP AspectJ XML Konfigurationsbeispiel

Spring ermöglicht es Ihnen, Aspekte, Ratgeber und Pointcuts in XML-Dateien zu definieren.

Auf der vorherigen Seite haben wir bereits das Beispiel mit den Anmerkungen von AOP gesehen. Jetzt werden wir dasselbe Beispiel durch eine XML-Konfigurationsdatei sehen.

Lassen Sie uns die XML-Elemente sehen, die zur Definition der Ratgeber verwendet werden.

aop: before Wird vor dem Aufruf der tatsächlichen Geschäftslogikmethode angewendet. aop: After Wird nach dem Aufruf der tatsächlichen Geschäftslogikmethode angewendet. aop: AfterReturningWird nach dem Aufruf der tatsächlichen Geschäftslogikmethode angewendet. Es kann zur Abfangung der Rückgabewerte in der Benachrichtigung verwendet werden. aop: Around Wird vor und nach dem Aufruf der tatsächlichen Geschäftslogikmethode angewendet. aop: AfterThrowingWenden Sie es an, wenn die tatsächliche Geschäftslogikmethode eine Ausnahme wirft.
Hinweis: Um die Konzepte von AOP und ihre Vorteile zu verstehen, besuchen Sie bitte hier. AOP Konzeptanleitung

1、aop: before

Wenden Sie "Before AspectJ Ratgeber" an, bevor die tatsächliche Geschäftslogikmethode aufgerufen wird. Sie können hier jede Art von Operation durchführen, z.B. Konvertierung, Authentifizierung usw.

Erstellen Sie eine Klasse, die die tatsächliche Geschäftslogik enthält.

Datei: Operation.java
package com.w;3codebox;
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;}
}

Nun erstellen wir eine Klasse, die vor dem Ratgeber enthalten ist.

Datei: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp)//es ist ein Rat
	{
		System.out.println("additional concern");
		//System.out.println("Method Signature: ");  + jp.getSignature());
	}
}

现在创建定义bean的applicationContext.xml文件。

Datei: 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"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:before method="myadvice" pointcut-ref="pointCutBefore" />
  </aop:aspect>
</aop:config>
</beans>

Lassen Sie uns nun die tatsächliche Methode nennen.

Datei: Test.java

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext kontext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("calling msg...");
		e.msg();
		System.out.println("calling m...");
		e.m();
		System.out.println("calling k...");
		e.k();
	}
}

Ausgabe

calling msg...
zusätzlicher Bedenken
msg() method invoked
calling m...
zusätzlicher Bedenken
m() method invoked
calling k...
zusätzlicher Bedenken
k() Methode aufgerufen

Wie Sie sehen können, werden vor dem Aufruf der Methoden msg(), m() und k() auch andere Probleme ausgegeben.


2、aop: Beispielsweise nach aop:

Nachdem die tatsächliche Geschäftslogikmethode aufgerufen wurde, wird AspectJ nach der Benachrichtigung angewendet. Es kann zur Wartung von Protokollen, Sicherheit und Benachrichtigungen verwendet werden.

Hier gehen wir davon aus, Operation.java TrackOperation.java Test.java 文件与aop: 中的示例相同。

现在创建定义bean的applicationContext.xml文件。

Datei: 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"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after method="myadvice" pointcut-ref="pointCutAfter" />
  </aop:aspect>
</aop:config>
</beans>

Ausgabe

calling msg...
msg() method invoked
zusätzlicher Bedenken
calling m...
m() method invoked
zusätzlicher Bedenken
calling k...
k() Methode aufgerufen
zusätzlicher Bedenken

您可以看到在调用msg(),m()和k()方法之后,还会出现其他问题。


3、aop: 返回后的示例

通过在返回建议后使用,我们可以在建议中获得结果。

创建

Datei: Operation.java

package com.w;3codebox;
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;}
}

创建返回建议后包含的方面类。

Datei: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Object result)//it is advice (after advice)
	{
		System.out.println("additional concern");
		System.out.println("Method Signature: ");  + jp.getSignature());
		System.out.println("Result in advice: ")+result);
		System.out.println("end of after returning advice...");
	}
}

Datei: 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"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after-returning method="myadvice" returning="result" pointcut-ref="pointCutAfterReturning" />
  </aop:aspect>
</aop:config>
</beans>

Datei: Test.java

Nun wird die Test-Klasse erstellt, die den tatsächlichen Methodenaufruf durchführt.

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext kontext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation e = (Operation) context.getBean("opBean");
		System.out.println("calling m...");
		System.out.println(e.m());
		System.out.println("calling k...");
		System.out.println(e.k());
	}
}

Ausgabe

calling m...
m() method invoked
zusätzlicher Bedenken
Methode Signatur: int com.w3codebox.Operation.m()
Ergebnis im Ratgeber: 2
Ende des Ratschlags nach dem Zurückkehren...
2
calling k...
k() Methode aufgerufen
zusätzlicher Bedenken
Methode Signatur: int com.w3codebox.Operation.k()
Ergebnis im Ratgeber: 3
Ende des Ratschlags nach dem Zurückkehren...
3

Sie können sehen, dass der Rückgabewert zweimal gedruckt wird, einmal vom TrackOperation-Klasse gedruckt und einmal vom Test-Klasse.


4、aop: around

AspectJ-Umgebungsratschläge werden vor und nach dem Aufruf der tatsächlichen Geschäftslogikmethode angewendet.

Erstellen Sie eine Klasse

Datei: Operation.java

package com.w;3codebox;
public  class Operation{
	public void msg(){System.out.println("msg() wird aufgerufen");}
	public void display(){System.out.println("display() wird aufgerufen");}
}

Erstellen Sie eine Klasse, die um den Advice herum liegt.

Sie müssen es im Advice-Methodenaufruf übergeben PreceedingJoinPoint Zitat, damit wir durch Aufruf von proceed() auf die Request()-Methode zugreifen können.

Datei: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.ProceedingJoinPoint;
public class TrackOperation
{
	public Object myadvice(ProceedingJoinPoint pjp) throws Throwable 
	{
		System.out.println("Zusätzliche Bedenken vor dem Aufruf des tatsächlichen Methoden");
		Object obj=pjp.proceed();
		System.out.println("Zusätzliche Bedenken nach dem Aufruf des tatsächlichen Methoden");
		return obj;
	}
}

Datei: 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"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:around method="myadvice" pointcut-ref="pointCutAround" />
  </aop:aspect>
</aop:config>
</beans>

Datei: Test.java

Nun wird die Test-Klasse erstellt, die den tatsächlichen Methodenaufruf durchführt.

package com.w;3codebox;
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();
	}
}

Ausgabe

Zusätzliche Bedenken vor dem Aufruf der tatsächlichen Methode
msg() wird aufgerufen
Zusätzliche Bedenken nach dem Aufruf der tatsächlichen Methode
Zusätzliche Bedenken vor dem Aufruf der tatsächlichen Methode
display() wird aufgerufen
Zusätzliche Bedenken nach dem Aufruf der tatsächlichen Methode

Sie sehen, dass vor dem Aufruf von msg() und dem Anzeigen der Methode auch andere Fragen ausgegeben werden.


5、aop: after-throwing

Durch die Verwendung des After-Throwing-Rats können wir im TrackOperation-Klassen Ausnahmen ausgeben. Sehen wir uns ein Beispiel für den AspectJ AfterThrowing-Rat an.

Erstellen Sie die Klasse, die die Geschäftslogik enthält.

Datei: Operation.java

package com.w;3codebox;
public  class Operation{
	public void validate(int age)throws Exception{
	if(age<18){
		throw new ArithmeticException("Not valid age");
	}
	else{
		System.out.println("Danke für vote");
	}
	}
}

Erstellen Sie die Klasse, die nach dem Auslösen des Rates enthalten ist.

Hier müssen wir eine Referenz auf Throwable weitergeben, damit wir hier den Ausnahmeablauf abfangen können.

Datei: TrackOperation.java

package com.w;3codebox;
import org.aspectj.lang.JoinPoint;
public class TrackOperation{
	public void myadvice(JoinPoint jp,Throwable error)//es ist ein Rat
	{
		System.out.println("additional concern");
		System.out.println("Method Signature: ");  + jp.getSignature());
		System.out.println("Exception is: ");+error);
		System.out.println("end of after throwing advice...");
	}
}

Datei: 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"	expression="execution(* com.w3codebox.Operation.*(..))" />
     <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />
  </aop:aspect>
</aop:config>
</beans>

Datei: Test.java

Nun wird die Test-Klasse erstellt, die den tatsächlichen Methodenaufruf durchführt.

package com.w;3codebox;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
	public static void main(String[] args){
		ApplicationContext kontext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Operation op = (Operation) context.getBean("opBean");
		System.out.println("validate aufrufen...");
		try{
			op.validate(19);
		catch(Exception e){System.out.println(e);}
		System.out.println("wieder validate aufrufen...");
		try{
		    op.validate(11);
		catch(Exception e){System.out.println(e);}
	}
}

Ausgabe

... wieder validate aufrufen...
Vielen Dank für die Stimme
... wieder validate aufrufen...
zusätzlicher Bedenken
Methodensignatur: void com.w3codebox.Operation.validate(int)
Das Ausnahme ist: java.lang.ArithmeticException: Ungültiges Alter
... Ende des nach dem Auswerfen von Ratschlägen
java.lang.ArithmeticException: Ungültiges Alter