[JAVA] Unterschied zwischen Spring AOP und Bibliothekszielklasse

Hintergrund

Implementieren Sie die Transaktionsverarbeitung für die Methode. Als ich versuchte, es mithilfe der Annotation @Transactional zu implementieren, trat beim Hinzufügen der Annotation eine BeanCreationException auf.

Lösungen

Erstellen Sie eine Schnittstelle für die Klasse, die die Zielmethode für die Transaktionsverarbeitung enthält, und fügen Sie der Methode der Implementierungsklasse die Annotation @Transactional hinzu. Jetzt gibt es keine Fehler mehr und Sie können erfolgreich kompilieren.

HogeProcessor.java


public interface HogeProcessor extends Processor<Object, Object> {
    Optional<Object> process(HogeEntity hogeEntity);
}

HogeProcessorImpl.java


public class HogeProcessorImpl implements HogeProcessor {

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public Optional<Object> process(HogeEntity hogeEntity) {
    ...
    ...
    }
}

Ursache

Ich habe selbst recherchiert, aber ich habe es nicht verstanden, also habe ich ihn gebeten, es mir zu sagen.

Wenn die Schnittstelle und die Implementierungsklasse getrennt und behoben sind, ist dies die Ursache. http://stackoverflow.com/questions/15688689/unsatisfieddependencyexception-in-spring-illegal-arguments-for-constructor-a

Aufgrund der Spezifikationen der für AOP verwendeten Bibliothek finden Sie Details hier. http://d.hatena.ne.jp/minokuba/20110321/1300705068

Ich habe es selbst nach dem Lesen der Seite, die mir beigebracht wurde, nicht verstanden, also habe ich es nachgeschlagen. Unten finden Sie eine Zusammenfassung der recherchierten Inhalte.

Unterschiede zwischen Spring AOP und Bibliotheken

Die @ Transactional-Annotation von Java wird mit Spring AOP realisiert, aber diese AOP-Bibliothek scheint die Ursache für diese Zeit zu sein.

Was ist AOP?

Aspektorientierte Programmierung. Aspekt ist ein Verhalten und eine Einheit der gemeinsamen Verarbeitung. Ein Mechanismus, mit dem Sie eine gemeinsame systematische Verarbeitung durchführen können, die für das Geschäft nicht unbedingt erforderlich ist.

Dieses Mal wird AOP verwendet, um den Prozess zum Starten der Transaktion zum Zeitpunkt des Aufrufs der angegebenen Methode einzufügen.

Es scheint, dass AOP aktiviert werden kann, indem Folgendes in die Einstellungsdatei geschrieben wird.

aop.xml


<!--AOP aktivieren-->
<aop:aspectj-autoproxy/>

Spring AOP-Bibliothekstyp

Im Frühjahr AOP -JDK Dynamic Proxy ・ CGLib Es können zwei Typen verwendet werden. In dem Projekt, bei dem diesmal das Problem auftrat, wurde nur der dynamische JDK-Proxy verwendet.

Proxyisierung

Die Klasse, auf die der AOP-Aspekt abzielt, muss eine JavaBean sein.

  1. Spring erstellt zur Laufzeit ein Proxy-Objekt für die Aspekt-Zielklasse.
  1. Führen Sie dann innerhalb des Proxy-Objekts die Verarbeitung der Aspektzielklasse durch.
  2. Wenn die Aspektzielklasse als Verknüpfungspunkt angegeben ist, wird die Beratungsmethode der Intercept-Klasse im Proxy aufgerufen.

http://hamasyou.com/blog/2004/11/09/spring-framework-jue-shu-ki-aop/

Mit anderen Worten, wenn die AOP-Bibliothek eine Bean einer Aspektzielklasse erstellt, erstellt sie ein ProxyObject, das in einen Proxy eingeschlossen ist (Proxy-Konvertierung).

Unterschiede in den Proxy-Zielklassen in Abhängigkeit von der AOP-Bibliothek

Es scheint nicht möglich zu sein, eine Instanz einer Bean, die vom dynamischen JDK-Proxy zum Proxy gemacht wurde, durch direkte Angabe der Implementierungsklasse automatisch zu verdrahten.

http://kamatama41.hatenablog.com/entry/20140327/1395928048

Bei Verwendung von JDK DynamicProxy ist die Klasse, die die Schnittstelle implementiert, das Ziel der Proxy-Konvertierung. Mit anderen Worten, es scheint, dass die Implementierungsklasse nicht direkt DI sein kann. Dieses Mal habe ich versucht, AOP von @ Transactional zu verwenden, während die Implementierungsklasse direkt DI war. Daher war dies nicht das Ziel der Proxyisierung von JDK DynamicProxy, und die Ursache war, dass BeanCreationException aufgetreten ist.

Also habe ich eine neue Schnittstelle für die vorhandene Klasse erstellt und diese in DI für diese Schnittstelle geändert und sie gelöst, indem ich die vorhandene Klasse zu einer Implementierungsklasse der Schnittstelle gemacht habe. Es scheint auch, dass die Implementierungsklasse mithilfe von CGLib, einer anderen AOP-Bibliothek, in einen Proxy umgewandelt werden kann. Daher habe ich es diesmal nicht versucht, aber es scheint eine Möglichkeit zu geben, dies zu verwenden.

Recommended Posts

Unterschied zwischen Spring AOP und Bibliothekszielklasse
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Instanzmethode und Klassenmethode
Unterschied zwischen Instanzvariable und Klassenvariable
Unterschied zwischen vh und%
Unterschied zwischen i ++ und ++ i
[Java] Unterschied zwischen == und gleich
Unterschied zwischen CUI und GUI
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Bundle und Bundle-Installation
Beziehung zwischen Paket und Klasse
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
Unterschied zwischen List und ArrayList
Unterschied zwischen .bashrc und .bash_profile
Unterschied zwischen StringBuilder und StringBuffer
Unterschied zwischen render und redirect_to
[Ruby] Unterschied zwischen get und post
Unterschied zwischen == Operator und Methode gleich
[Java] Unterschied zwischen Hashmap und HashTable
[Terminal] Unterschied zwischen irb und pry
JavaServlet: Unterschied zwischen executeQuery und executeUpdate
[Ruby] Unterschied zwischen is_a? Und instance_of?
Unterschied zwischen dem Operator == und der Methode eqals
[Ruby] Vielleicht verstehst du das nicht wirklich? [Unterschied zwischen Klasse und Modul]
Grober Unterschied zwischen RSpec und Minitest
[Rails] Unterschied zwischen find und find_by
[JAVA] Unterschied zwischen Abstract und Interface
Unterschied zwischen Thymeleaf @RestController und @Controller
Unterschied zwischen Stream Map und FlatMap
[Java] Unterschied zwischen Array und ArrayList
Unterschied zwischen primitivem Typ und Referenztyp
Unterschied zwischen string.getByte () und Hex.decodeHex (string.toCharaArray ())
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen StringBuffer und StringBuilder
[Java] Unterschied zwischen Länge, Länge () und Größe ()
Der Unterschied zwischen der Ruby-Instanzmethode und der Klassenmethode ist leicht zu verstehen.
[Rails] Unterschied zwischen redirect_to und Rendern
[Android] Unterschied zwischen finish () und return;
Hinweis: Unterschied zwischen Ruby "p" und "Puts"
Unterschied zwischen final und Immutable in Java
[Hinweis] Unterschied zwischen Bundle-Installation und -Update
Feder mit Kotorin --2 RestController und Datenklasse
Unterschied zwischen pop () und peek () im Stapel
[Für Anfänger] Unterschied zwischen Java und Kotlin
Unterschied zwischen isEmpty und isBlank von StringUtils
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
Unterschied zwischen getText () und getAttribute () von Selen
Über den Unterschied zwischen irb und pry
Unterschied zwischen "|| =" und "instance_variable_defined?" Im Ruby-Memo
Unterschied zwischen EMPTY_ELEMENTDATA und DEFAULTCAPACITY_EMPTY_ELEMENTDATA in ArrayList
[Ruby] Unterschied zwischen print, put und p