Ich habe eine benutzerdefinierte Around implementiert, um auf eine benutzerdefinierte Annotation übereinstimmen. Ich möchte, dass die benutzerdefinierte Umgebung innerhalb des äußeren @Transactional ausgeführt wird. Leider scheint dies nicht zu funktionieren. (Das AOP funktioniert. Ich sehe Stacktraces, die es zeigen).Benutzerdefinierte Frühling AOP um + @Transactional
Die Stack-Traces zeigen, dass mein AOP zuvor ausgeführt wurde (ein Logger), die MyBatis-Sitzung eine Transaktion startet, MyBatis die Transaktionen schließt, Spring die Transaktion schließt und dann mein AOP beendet.
Ich dachte, mein AOP-Gerät hätte geholfen. Ich habe den Rückgabewert auf 1 gesetzt. Ich habe es benutzt. Das hat nicht funktioniert. Ich denke es liegt daran, dass ich falsch gelesen habe, wie Spring bestellt.
Beratung Bestellung
Was passiert, wenn mehrere Stücke von Beratung alle an der gleichen Stelle beitreten ausführen möchten? Spring AOP folgt den gleichen Vorrangregeln wie AspectJ, um die Reihenfolge der Ausführung von Advice zu bestimmen. Der höchste Precedence Advice wird zuerst "auf dem Weg dorthin" ausgeführt (also zwei Stücke von vor dem Rat gegeben, der mit der höchsten Priorität läuft zuerst). "Auf der Ausweg" von einem Join-Punkt, läuft die höchste Precedence Beratung letzten (so gegeben zwei Stücke von nach Beratung, die mit der höchsten Vorrang wird als zweiter laufen).
Wenn zwei Ratschläge, die in verschiedenen Aspekten definiert sind, beide am selben Join-Punkt ausführen müssen, ist die Reihenfolge nicht definiert. Sie können die Reihenfolge der Ausführung steuern, indem Sie die Priorität angeben. Dies geschieht im normalen Spring-Verfahren, indem entweder die org.springframework.core.Ordered-Schnittstelle in der Aspektklasse implementiert oder mit der Order-Annotation versehen wird. Bei zwei Aspekten hat der Aspekt, der den niedrigeren Wert von Ordered.getValue() (oder den Anmerkungswert) zurückgibt, die höhere Priorität.
Wenn zwei Ratschläge im gleichen Aspekte definiert müssen beide an den gleichen beitreten Punkt laufen, die Reihenfolge nicht definiert ist (da es kein Weg, um die Erklärung, um über Reflexion für javac-kompilierten Klassen abgerufen werden) . Ziehen Sie in Betracht, solche Beratungsmethoden in eine Beratungsmethode pro Verknüpfungspunkt in jeder Aspektklasse zu reduzieren oder die Ratschläge in separate Aspektklassen umzuwandeln - die auf der Aspektebene bestellt werden können.
Also nahm ich das Bestellattribut heraus. Dies sollte @Transactional integer.MIN_VALUE zurückgeben. Also sollte es, wenn ich das Zitat oben verstanden habe, zuletzt laufen. Wenn ich es erneut implementiert habe, wurde es immer noch rückwärts ausgeführt. Mein AOP, Spring TX, MyBatis, Schließen MyBatis, Schließen Spring Tx, Schließen Sie mein AOP.
Was mache ich falsch?