Ciele
- Naučiť sa používať Aspektovo-orientované programovanie
- Naučiť sa používať nástroj AspectJ.
Postup
Krok 1: Pridanie modulu do zadania
Úloha 1.1
Pridajte Maven modul orm-aspects do projektu vášho zadania. Konfigurácia je opísaná v popise zadania 3.
Úloha 1.2
Použite aspekty z tohto projektu v module example-app. Modifikujte example-app/pom.xml podľa znenia zadania
Krok 2: Prvý aspekt
Pre vyskúšanie práce s AspectJ vytvorme jednoduchý aspekt pre monitorovanie databázových operácií.
Úloha 2.1
Vytvorte súbor orm-aspects/src/main/aspect/sk/tuke/meta/persistence/DBMonitoring.aj.
Poznámka
Všimnite si, že namiesto src/main/java sa používa src/main/aspect, keďže je to odlišný jazyk. Ďalej však nasleduje štruktúra adresárov zodpovedajúca balíkom, rovnako ako v Jave.
Obsah súboru nech je následovný:
package sk.tuke.meta.persistence;
import java.sql.Statement;
public aspect DBMonitoring {
pointcut statementExecution(Statement stmt):
call(* Statement+.execute*(..)) && target(stmt);
before(Statement stmt): statementExecution(stmt) {
System.out.println("Executing SQL: " + stmt);
}
}
Úloha 2.2
Vyskúšajte spustiť projekt example-app a sledujte výpisy. Mali by sa tam objaviť výpisy všetkých vykonávaných SQL príkazov.
Úloha 2.3
Preštudujte si kód aspektu a snažte sa pochopiť jeho fungovanie.
Krok 3: @AspectJ
AspectJ ponúka aj alternatívny spôsob zápisu aspektov – pomocou Java tried s anotáciami. Môžete si vyskúšať aj tento zápis.
Úloha 3.1
Vytvorte súbor orm-aspects/src/main/java/sk/tuke/meta/persistence/DBMonitoring2.java.
Poznámka
Teraz sa použil adresár src/main/java, keďže aspekt je definovaný pomocou Java triedy, ktorá je najprv prekladaná prekladačom Java a až následne pretkávaná pomocou AspectJ.
Číslo 2 v názve je len na odlíšenie od predchádzajúceho aspektu.
Obsah súboru nech je nasledovný:
package sk.tuke.meta.persistence;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import java.sql.Statement;
@Aspect
public class DBMonitoring2 {
@Pointcut("call(* java.sql.Statement+.execute*(..)) && target(stmt)")
public void statementExecution(Statement stmt) {}
@Before("statementExecution(statement)")
public void beforeStatementExecution(Statement statement) {
System.out.println("Executing SQL: " + statement);
}
}
Poznámka
Všimnite si, že v tomto zápise musia byť v bodových prierezoch použité úplné názvy tried (napr. java.sql.Statement).
Krok 4: Zadanie
Pre druhú úlohu zadania 3 potrebujete realizovať aspekt transakcií.
Úloha 4.1
Implementujte aspekt pre podporu transakcií podľa popisu v zadaní 3.
Aspekt sa naviaže na metódy označené anotáciou @AtomicPersistenceOperation (tu si musíte definovať), napríklad v projekte example-app (nie v orm-runtime).