AOP

Ciele

  1. Naučiť sa používať Aspektovo-orientované programovanie
  2. 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).