..
Låt oss nu se hur man skapar en aspekt.
Först skapar vi ett gränssnitt som exempel ska vi skriva till vår pointcuts:
public interface MyInterface {
public void f1 ();
public int f2 ();
public int f3 () kastar undantag;
public void f4 () kastar undantag;
public int F5 ();
}
Att skriva en pointcut måste veta AspectJ pointcut beteckningar , i våra exempel kommer vi att använda enbart utförande som matchar ansluta metoder punkten utförande.
utförande (modifierare-mönster? Deklarera RET-type-mönster-type-mönster? namn-mönster (para-mönster) kastar-mönster?)där:
Först måste vi skapa vår egen aspekt:
@ Aspect
{Public class MyAspect
.............
}
Som vi ser klassen är kommenterad med @ Aspect.
Detta är inte tillräckligt eftersom du måste aktivera stöd för AOP nell'applicationContext XML.:
<-! ENBLING AspectJ -> <aop:aspectj-autoproxy /> <-! MYASPECT -> <bean id="myAspect" class="it.mrwebmaster.aop.MyAspect" />
När du har gjort dessa två operationer är redo att skapa ett råd, till exempel en åtgärd som utförs före verkställandet av metoden f1 (före råd):
@ Före ("utförande (* it.mrwebmaster.aop.MyInterface.f1 (..))")
public void beforeF1 () {
System.out.println ("FÖRE F1");
}
Som framgår av den kod vi använde @ Innan anteckning som accepterar ett uttryck som ett värde som identifierar en pointcut.
I vårt exempel matchar uttrycket alla metoder som kallas gränssnitt it.mrwebmaster.aop.MyInterface F1 indipendetemente av deras modifierare, returtyp och parametrar ingång.
Likaså kan vi använda ett råd som körs när en metod slutför genomförandet (efter att ha återvänt råd) korrekt med hjälp av anteckningar @ AfterReturning:
@ AfterReturning (pointcut = "utförande (* it.mrwebmaster.aop.MyInterface.f2 (..))", tillbaka =" retVal ")
public void afterReturningF2 (Object retVal) {
System.out.println ("RETURN F2" + retVal);
}
Detta rekord tar följande parametrar, utöver pointcuts, återvände namnet på det objekt enligt den metod som kan ges som input parameter för Advaita.
I detta fall ett uttryck för pointcut är inviarata utom namnet av metoden, som i detta fall, F2.
@ AfterThrowing (pointcut = "utförande (* it.mrwebmaster.aop.MyInterface.f3 (..))", kastar =" Throwable ")
public void afterThrowingF3 (Throwable Throwable) {
System.out.println ("F3 kastar" + Throwable);
}
Skillnaden är att metoden inte returnerar ett objekt, men ett undantag.
En annan typ av rådgivning alltid sker efter en metod, är det dags normalt eller kastar ett undantag (efter råd). Detta råd har genomförts med hjälp av @ Efter:
@ Efter ("utförande (* it.mrwebmaster.aop.MyInterface.f4 (..))")
public void afterF4 () {
System.out.println ("EFTER F4");
}
Slutligen ser vi hur man gör "omkring råd:
@ Around ("utförande (* it.mrwebmaster.aop.MyInterface.f5 (..))")
public void aroundF5 (ProceedingJoinPoint PJP) {
System.out.println ("FÖRE F5");
try {
Objekt retVal = pjp.proceed ();
System.out.println ("RETURN F5" + retVal);
} Catch (Throwable e) {
System.out.println ("F5 kastar" + e);
}
}
Som vi kan se koden för pointcut uttryck skiljer sig inte från andra råd.
Vilka förändringar är samma råd som uttryckligen måste åberopa verkställandet av metoden genom den metoden i klassen ProceedingJoinPoint gå vidare, en vars ansökan skickas som indata.
Detta gränssnitt ger också använder andra metoder fortsätta att hämta information om metoden parametrar, returtyp och objektet på vilken metod som exekveras.
Det är upp till läsaren något djupare.
För att testa våra råd vi kan göra är att skriva en trivial genomförandet av gränssnittet MyInterface och skapa en viktig test:
MyInterfaceImpl {public klass implementerar MyInterface
@ Åsidosätt
public void f1 () {
System.out.println ("F1");
}
@ Åsidosätt
public int f2 () {
System.out.println ("F2");
återvända 0;
}
@ Åsidosätt
public int f3 () kastar undantag {
System.out.println ("F3");
kasta nytt undantag ("Exception F3");
}
@ Åsidosätt
public void f4 () kastar undantag {
System.out.println ("F4");
}
@ Åsidosätt
public int F5 () {
System.out.println ("F5");
återvända 0;
}
}
. nell'applicationContext xml:
<-! Target: Object -> <bean id="myInterfaceImpl" class="it.mrwebmaster.aop.MyInterfaceImpl" />De viktigaste test:
public class Huvudnamnrymden {
public void main (String [] args) {
/ **
* Instanz IOK behållaren
* /
ApplicationContext ApplicationContext ClassPathXmlApplicationContext = new ("applicationContext.xml");
MyInterface MyInterface = (MyInterface) applicationContext.getBean ("myInterfaceImpl");
myInterface.f1 ();
System.out.println ("########## \ n ");
myInterface.f2 ();
System.out.println ("########## \ n ");
try {
myInterface.f3 ();
} Catch (Exception e) {}
System.out.println ("########## \ n ");
try {
myInterface.f4 ();
} Catch (Exception e) {}
System.out.println ("########## \ n ");
myInterface.f5 ();
System.out.println ("########## \ n ");
}
}
| |
Linux (kurs)
Komplett av öppen källkod-system. Från 49 €. |
| |
PHP (kurs)
Fullständig kurs för att skapa dynamiska webbplatser. Från 49 €. |
| |
Ruby och Ruby on Rails (kurs)
Skapa program och webbapplikationer med Ruby och RoR. Från 39 €. |