In diesem Lernprogramm zeigen wir Ihnen, wie Sie die AspectJ-Anmerkung in das Spring AOP-Framework integrieren. Mit Spring AOP AspectJ können Sie die Methode einfach abfangen.
Häufige Anmerkungen zu AspectJ:
-
@ Before - Vor der Methodenausführung ausführen
-
@ After - Ausführen, nachdem die Methode ein Ergebnis zurückgegeben hat
-
@ AfterReturning - Ausführen, nachdem die Methode ein Ergebnis zurückgegeben hat
auch das zurückgegebene Ergebnis.
-
@ AfterThrowing - Ausführen, nachdem die Methode eine Ausnahme ausgelöst hat
-
@ Around - Durchlaufen Sie die Methodenausführung und kombinieren Sie alle drei Hinweise
über.
1. Verzeichnisstruktur
Siehe Verzeichnisstruktur dieses Beispiels.
2. Projektabhängigkeiten
Zum Aktivieren von AspectJ benötigen Sie
aspectjrt.jar
,
aspectjweaver.jar
und
spring-aop.jar
. Siehe folgende Maven-Datei
pom.xml
.
-
AspectJ wird seit Spring 2.0 unterstützt. ** In diesem Beispiel wird Spring 3 verwendet. Die AspectJ-Funktionen werden jedoch seit Spring 2.0 unterstützt.
Datei: pom.xml
<project ...> <properties> <spring.version>3.0.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring AOP + AspectJ --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> </dependencies> </project>
3. Frühlingsbohnen
Normales Bean, mit wenigen Methoden, fängt es später über die AspectJ-Annotation ab.
package com.mkyong.customer.bo; public interface CustomerBo { void addCustomer(); String addCustomerReturnValue(); void addCustomerThrowException() throws Exception; void addCustomerAround(String name); }
package com.mkyong.customer.bo.impl; import com.mkyong.customer.bo.CustomerBo; public class CustomerBoImpl implements CustomerBo { public void addCustomer(){ System.out.println("addCustomer() is running "); } public String addCustomerReturnValue(){ System.out.println("addCustomerReturnValue() is running "); return "abc"; } public void addCustomerThrowException() throws Exception { System.out.println("addCustomerThrowException() is running "); throw new Exception("Generic Error"); } public void addCustomerAround(String name){ System.out.println("addCustomerAround() is running, args : " + name); } }
4. AspectJ aktivieren
Fügen Sie in der Spring-Konfigurationsdatei „` <aop: aspectj-autoproxy/> `“ ein und definieren Sie Ihren Aspect (Interceptor) und Ihre normale Bean.
Datei: Spring-Customer.xml
<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="customerBo" class="com.mkyong.customer.bo.impl.CustomerBoImpl"/> <!-- Aspect --> <bean id="logAspect" class="com.mkyong.aspect.LoggingAspect"/> </beans>
4. AspectJ @Before
Im folgenden Beispiel wird die Methode 'logBefore ()' vor der Ausführung der Schnittstelle 'customerCo' (Methode addCustomer ()) ausgeführt.
-
Hinweis ** + AspectJ “pointcuts” wird verwendet, um anzugeben, welche Methode abgefangen wird, und Sie sollten diese http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html verwenden/aop.html#aop-pointcuts[Spring AOP Pointcuts Guide]für eine vollständige Liste der unterstützten Pointcuts-Ausdrücke.
Datei: LoggingAspect.java
package com.mkyong.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(** com.mkyong.customer.bo.CustomerBo.addCustomer(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("logBefore() is running!"); System.out.println("hijacked : " + joinPoint.getSignature().getName()); System.out.println("** ** ** ** ** ** "); } }
Starte es
CustomerBo customer = (CustomerBo) appContext.getBean("customerBo"); customer.addCustomer();
Ausgabe
logBefore() is running! hijacked : addCustomer ** ** ** ** ** ** addCustomer () läuft
5. AspectJ @After
Im folgenden Beispiel wird die Methode `logAfter () 'nach der ausgeführt Ausführung der customerBo-Schnittstelle, Methode 'addCustomer ()'.
Datei: LoggingAspect.java
Paket com.mkyong.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.After; @Aspect öffentliche Klasse LoggingAspect { @After ("Ausführung (** com.mkyong.customer.bo.CustomerBo.addCustomer (..))") public void logAfter (JoinPoint joinPoint) { System.out.println ("logAfter () läuft!"); System.out.println ("hijacked:" + joinPoint.getSignature (). GetName ()); System.out.println ("** ** ** ** ** ** "); } }
Starte es
CustomerBo customer = (CustomerBo) appContext.getBean ("customerBo"); customer.addCustomer ();
Ausgabe
addCustomer () läuft logAfter () läuft! entführt: addCustomer ** ** ** ** ** **
6. AspectJ @AfterReturning
In dem folgenden Beispiel wird die Methode 'logAfterReturning ()' nach der Ausführung der Methode 'addCustomerReturnValue ()' der customerBo-Schnittstelle ausgeführt. Außerdem können Sie den zurückgegebenen Wert mit dem Attribut „ returning “ abfangen.
Um den zurückgegebenen Wert abzufangen, muss der Wert des "returning" -Attributs (Ergebnis) mit dem Methodenparameter (Ergebnis) identisch sein.
Datei: LoggingAspect.java
package com.mkyong.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.AfterReturning; @Aspect public class LoggingAspect { @AfterReturning( pointcut = "execution(** com.mkyong.customer.bo.CustomerBo.addCustomerReturnValue(..))", returning= "result") public void logAfterReturning(JoinPoint joinPoint, Object result) { System.out.println("logAfterReturning() is running!"); System.out.println("hijacked : " + joinPoint.getSignature().getName()); System.out.println("Method returned value is : " + result); System.out.println("** ** ** ** ** ** "); } }
Starte es
CustomerBo customer = (CustomerBo) appContext.getBean("customerBo"); customer.addCustomerReturnValue();
Ausgabe
addCustomerReturnValue() is running logAfterReturning() is running! hijacked : addCustomerReturnValue Method returned value is : abc ** ** ** ** ** **
7. AspectJ @AfterReturning
In below example, the
logAfterThrowing()
method will be executed if
the customerBo interface,
addCustomerThrowException()
method is
throwing an exception.
File : LoggingAspect.java
Paket com.mkyong.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.AfterThrowing; @Aspect öffentliche Klasse LoggingAspect { @AfterThrowing (pointcut = "Ausführung (** com.mkyong.customer.bo.CustomerBo.addCustomerThrowException (..))", warf = "error") System.out.println ("logAfterThrowing () läuft!"); System.out.println ("hijacked:" joinPoint.getSignature (). GetName ()); System.out.println (Fehler "Ausnahme:"); System.out.println ("** ** ** ** ** ** "); } }
Starte es
CustomerBo customer = (CustomerBo) appContext.getBean ("customerBo"); customer.addCustomerThrowException ();
Ausgabe
addCustomerThrowException () läuft logAfterThrowing () läuft! entführt: addCustomerThrowException Ausnahme: java.lang.Exception: Generischer Fehler ** ** ** ** ** ** Ausnahme im Thread "main" java.lang.Exception: Generic Error //...
8. AspectJ @Around
In dem folgenden Beispiel wird die Methode 'logAround ()' vor der customerBo-Schnittstelle, der Methode 'addCustomerAround ()' ausgeführt, und Sie müssen die Definition von 'joinPoint.proceed (); `definieren, um zu steuern, wann der Interceptor das zurückgeben soll steuern Sie die ursprüngliche Methode 'addCustomerAround ()'.
Datei: LoggingAspect.java
package com.mkyong.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Around; @Aspect public class LoggingAspect { @Around("execution(** com.mkyong.customer.bo.CustomerBo.addCustomerAround(..))") public void logAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("logAround() is running!"); System.out.println("hijacked method : " + joinPoint.getSignature().getName()); System.out.println("hijacked arguments : " + Arrays.toString(joinPoint.getArgs())); System.out.println("Around before is running!"); joinPoint.proceed();//continue on the intercepted method System.out.println("Around after is running!"); System.out.println("** ** ** ** ** ** "); } }
Starte es
CustomerBo customer = (CustomerBo) appContext.getBean("customerBo"); customer.addCustomerAround("mkyong");
Ausgabe
logAround() is running! hijacked method : addCustomerAround hijacked arguments :[mkyong]Around before is running! addCustomerAround() is running, args : mkyong Around after is running! ** ** ** ** ** **
Conclusion
It’s always recommended to apply the least power AsjectJ annotation. It’s rather long article about AspectJ in Spring. for further explanations and examples, please visit the reference links below.
-
Anti annotation or using JDK 1.4 ?**
No worry, AspectJ supported XML configuration also, read this Spring AOP + AspectJ XML example .
Download Source Code
Download it – Spring3-AOP-AspectJ-Example.zip (8 KB)