English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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: AfterReturning
Wird 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: AfterThrowing
Wenden Sie es an, wenn die tatsächliche Geschäftslogikmethode eine Ausnahme wirft.
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.javapackage 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.
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()方法之后,还会出现其他问题。
通过在返回建议后使用,我们可以在建议中获得结果。
创建
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.
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.
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