Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Spring AOP-Anmerkungen

Detaillierte Erläuterung der Spring AOP-Anmerkungen

Guanhui
Guanhuinach vorne
2020-06-28 17:59:443324Durchsuche

Detaillierte Erläuterung der Spring AOP-Anmerkungen

Aspekt: ​​Aspekt

Aspekt = Punktschnitt + Benachrichtigung. In alten Spring-Versionen wird normalerweise die XML-Konfiguration verwendet, aber jetzt wird eine Klasse normalerweise mit @Aspect annotiert. Aspekte sind dafür verantwortlich, übergreifende Logik (Ratschläge) in bestimmte Verbindungspunkte einzubinden.

Zielobjekt: Ziel

Das zu verbessernde Objekt.

Join Point: JoinPoint

Der Programmausführungspunkt, der abgefangen werden kann, ist die Methode in der Klasse im Frühjahr.

Einstiegspunkt: PointCut

Die Methode, die das Abfangen durchführen muss, dh die Methode, die speziell die übergreifende Logik implementiert. Pointcut-Regeln werden im Frühjahr durch die Pointcut-Ausdruckssprache AspectJ beschrieben.

Der Unterschied zwischen Einstiegspunkten und Verbindungspunkten: Verbindungspunkte sind alle Punkte, die „geschnitten“ werden können; Einstiegspunkte sind die Punkte, die wirklich geschnitten werden wollen.

Beratung: Beratung

Übergreifende Logik für Einstiegspunkte, einschließlich verschiedener Arten von Ratschlägen wie „um“, „vorher“ und „nachher“ .

Der Benachrichtigungsaktionspunkt ist wie folgt benannt:

  • vorher: wird vor dem Einstiegspunkt ausgeführt

  • nachher: nach Nach dem Einstiegspunkt ausführen

  • um: Abfangmethode am Einstiegspunkt, vor und nach der Anpassung, flexibler

Es gibt auch einige Ausnahmebehandlungsbenachrichtigungen. Hier sind keine Beispiele für

Weben: Weben

Der Prozess des Verbindens von Aspekten und Zielobjekten, um Proxy-Objekte zu erstellen. Im Frühjahr wird ein dynamischer Proxy verwendet. Wenn das Zielobjekt über eine Schnittstelle verfügt, verwenden Sie den dynamischen JDK-Proxy. Andernfalls verwenden Sie den dynamischen cglib-Proxy.

Nachdem wir über so viele Konzepte gesprochen haben, kann ein Blick auf die Code-Implementierung den Lesern helfen, sie besser zu verstehen. Hier ist eine einfache AOP-Demo, die die Methode durch Anmerkungen erweitert.
Zuerst ist die Aspektklasse:

package com.example.demo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author Fcb
 * @date 2020/6/20
 * @description 切面类=切入点+通知
 */
@Aspect
@Component
public class LogAspect {

  //这个方法定义了切入点
  @Pointcut("@annotation(com.example.demo.aop.anno.MyLog)")
  public void pointCut() {}

  //这个方法定义了具体的通知
  @After("pointCut()")
  public void recordRequestParam(JoinPoint joinPoint) {
    for (Object s : joinPoint.getArgs()) {
      //打印所有参数,实际中就是记录日志了
      System.out.println("after advice : " + s);
    }
  }

  //这个方法定义了具体的通知
  @Before("pointCut()")
  public void startRecord(JoinPoint joinPoint) {
    for (Object s : joinPoint.getArgs()) {
      //打印所有参数
      System.out.println("before advice : " + s);
    }
  }

  //这个方法定义了具体的通知
  @Around("pointCut()")
  public Object aroundRecord(ProceedingJoinPoint pjp) throws Throwable {
    for (Object s : pjp.getArgs()) {
      //打印所有参数
      System.out.println("around advice : " + s);
    }
    return pjp.proceed();
  }
}

Anmerkung:

package com.example.demo.aop.anno;
import java.lang.annotation.*;
/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyLog {
}

Zielklasse:

package com.example.demo.aop.target;

import com.example.demo.aop.anno.MyLog;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@RestController
public class MockController {

  @RequestMapping("/hello")
  @MyLog
  public String helloAop(@RequestParam String key) {
    System.out.println("do something...");
    return "hello world";
  }

}

Schließlich ist die Testklasse:

package com.example.demo.aop.target;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@SpringBootTest
class MockControllerTest {
  @Autowired
  MockController mockController;

  @Test
  void helloAop() {
    mockController.helloAop("aop");
  }
}

Konsolenergebnis :

Um Rat: aop
Vor Rat: aop
tun Sie etwas...
Nach dem Rat: aop

Empfohlenes Tutorial: "Java-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Spring AOP-Anmerkungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen