Dies ist eine Geschichte über AOP von Java Spring Framework.
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.
Aspekt
Das Modul selbst, das Querschnittsinteressen zeigt.Join Point
Ein Punkt, der Querschnittsthemen ausführt (zum Zeitpunkt der Ausführung der Methode oder des Auslösens).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
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/de1019aeaaab51c8784dMyController.java
@Controller
@RequestMapping("/hogehoge")
public class MyController {
@GetMapping
@MyAnnotation(hoge = "test", piyo = false)
public String doGet(HttpServletRequest req, HttpServletResponse res) {
//~ Verarbeitung ~
return "hogehoge";
}
}
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();
}
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
}
}
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