[JAVA] Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben

Einführung

Dies ist eine Geschichte über AOP von Java Spring Framework.

Verwendung von @Aspect

Zum Beispiel gibt es 100 Klassen, die eine bestimmte Service-Klasse verwenden möchten, und dies kann durch Hinzufügen von "@ Autowired" jedes Mal und DI realisiert werden, aber es ist nicht sehr klug. Verbessern Sie daher die Sichtbarkeit des Quellcodes, indem Sie den Prozess (Klasse mit der Annotation "@ Aspect") definieren, den Sie an verschiedenen Stellen ausführen möchten, und den Prozess einfügen, indem Sie der Methode der Klasse, die Sie verwenden möchten, eine Annotation hinzufügen. Das ist der Zweck.

Bestätigung der Bedingungen

  1. Aspekt Das Modul selbst, das Querschnittsinteressen zeigt.
  2. Join Point Ein Punkt, der Querschnittsthemen ausführt (zum Zeitpunkt der Ausführung der Methode oder des Auslösens).
  3. Beratung Der Code, der an einem bestimmten JoinPoint ausgeführt wird, die Implementierung von Querschnittsthemen. @ Around ist sehr vielseitig, aber wenn Sie das Timing einschränken möchten, z. B. die Verarbeitung, die Sie nur ausführen möchten, wenn die Verarbeitung der Zielmethode erfolgreich ist, sollten Sie Ratschläge verwenden, die Ihrem Zweck entsprechen.
@Vor der Verarbeitung vor der Verarbeitung der Zielmethode
@AfterReturning Wird verarbeitet, wenn die Zielmethode erfolgreich verarbeitet wurde
@AfterThrowing Wird verarbeitet, wenn bei der Verarbeitung der Zielmethode eine Ausnahme ausgelöst wird
@Nachher: Wird verarbeitet, wenn der Prozess abgeschlossen ist, unabhängig vom Erfolg oder Misserfolg des Prozesses der Zielmethode
@Rund Vor und nach der Verarbeitung der Zielmethode ausgeführt
  1. pointcut Ein Ausdruck, der den auszuführenden JoinPoint auswählt. Sie können den Ausführungszeitpunkt detailliert eingrenzen, indem Sie die Bedingungen angeben. Ich werde es diesmal nicht anfassen. Folgendes wird hilfreich sein. https://qiita.com/rubytomato@github/items/de1019aeaaab51c8784d

Konkretes Beispiel

Controller mit Aspekt

MyController.java


@Controller
@RequestMapping("/hogehoge")
public class MyController {

    @GetMapping
    @MyAnnotation(hoge = "test", piyo = false)
    public String doGet(HttpServletRequest req, HttpServletResponse res) {
        //~ Verarbeitung ~
        return "hogehoge";
    }
}

Definition der Anmerkung

Dieser Bereich war hilfreich. https://itsakura.com/java-annotation-make Primitiver Typ, Zeichenfolge, Klasse, Aufzählungstyp, Annotation und nur ein eindimensionales Array davon können als Argumente angegeben werden. https://www.ne.jp/asahi/hishidama/home/tech/java/annotation.html

MyAnnotation.java


//Der Umfang der Anmerkung.
@Retention(RetentionPolicy.RUNTIME)
//Ziel, dem Sie eine Anmerkung geben möchten.
@Target(ElementType.METHOD)
public @interface MyAnnotation {

    /**String*/
    String hoge();

    /** boolean */
    boolean piyo();
}

Aspekt, der die Definition von Annotation als Argument erhält

MyAspect.java


@Aspect
@Component
public class MyAspect {

    @AfterReturning("@annotation(myAnnotation)")
    public void after(JoinPoint jp, MyAnnotation myAnnotation) throws Throwable {
        //Versuchen Sie, das Argument des Anrufers zu erhalten
        //Hier können Sie die HttpServletRequest-Anforderung und die HttpServletResponse res des Anrufers abrufen
        Object[] o = jp.getArgs();
        
        //Kann Anmerkungsargumente akzeptieren
        String hoge = myAnnotation.hoge();
        System.out.println(hoge); // test
        boolean piyo = myAnnotation.piyo();
        System.out.println(piyo); // false
    }
}

Zusammenfassung

Wenn Sie die Argumente der aufrufenden Methode erhalten möchten
    protected HttpServletRequest getRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest()
                .getParameter("hoge");
    }

--Variable kann nicht als Argument der Annotation (Argument) übergeben werden. Primitiver Typ, Zeichenfolge, Klasse, Aufzählungstyp, Anmerkung und nur ein eindimensionales Array davon können angegeben werden. )

Recommended Posts

Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte den Inhalt der Absicht var_dump
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich möchte eine Methode einer anderen Klasse aufrufen
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte die Hauptmethode mit Reflektion aufrufen
[Grober Kommentar] Ich möchte die Zupfmethode heiraten
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte Tomcat auf den Server bringen und die Anwendung starten
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich möchte mehrere Rückgabewerte für das eingegebene Argument zurückgeben
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich habe versucht, die Methode zu erklären
Ich möchte eine Liste des Inhalts einer Zip-Datei und ihrer unkomprimierten Größe erhalten
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Methode, um die Anzahl der Jahre zu addieren und das Monatsende zu erhalten
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich möchte die Standardfehlermeldung von Spring Boot steuern
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich möchte die Methode des Controllers kennen, bei der die Ausnahme im ExceptionHandler von Spring Boot ausgelöst wurde
Ich wollte der Methode @VisibleForTesting hinzufügen
Ich war süchtig nach der Rollmethode
Ich möchte Bilder mit REST Controller von Java und Spring anzeigen!
Ich möchte die JSP des offenen Portlets bei der Entwicklung von Liferay kennen
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
[Active Admin] Ich möchte die Standardverarbeitung zum Erstellen und Aktualisieren anpassen
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Ich möchte den Wert von Cell unabhängig vom CellType (Apache POI) transparent erhalten.
Ich habe die Eigenschaften von Java und .NET verglichen
[Ruby] Ich möchte einen Methodensprung machen!
Wenn Sie die Methode außerhalb verwenden möchten
Ausgabe der Verwendung der Slice-Methode
[Rubiy] Ich möchte mit der Split-Methode ein Array aus einer Zeichenfolge erstellen. Und umgekehrt.
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
Wenn Sie einem Argument in einer Ruby-Methode neu zuweisen und dann "super" aufrufen → Das neu zugewiesene wird verwendet
[JDBC ③] Ich habe versucht, mithilfe von Platzhaltern und Argumenten Eingaben über die Hauptmethode vorzunehmen.
Ich möchte den Wert in Ruby erhalten
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Das Argument von link_to ist nil (null) und ein unerwarteter Link wurde generiert, daher habe ich versucht, ihn zu überprüfen