2014-05-19 7 views
6

Von Frühling Referenz docDoes Frühling @transaction Arbeit an einem konkreten Verfahren der abstrakten Klasse

Frühling empfiehlt, nur konkrete Klassen (und Methoden der konkreten Klassen) mit der @Transactional Anmerkung Anmerkungen versehen, im Gegensatz zu annotieren Schnittstellen. Sie können die Annotation @Transactional auf eine Schnittstelle (oder eine Interface-Methode) setzen, aber das funktioniert nur so, wie Sie es erwarten würden, wenn Sie Interface-basierte Proxies verwenden. Die Tatsache, dass Java Annotationen nicht von Interfaces geerbt werden, bedeutet, dass Sie, wenn Sie klassenbasierte Proxys (proxy-target-class = "true") oder webbasierte Aspekte (mode = "aspectj") verwenden, die Transaktionseinstellungen verwenden werden von der Proxy- und Web-Infrastruktur nicht erkannt und das Objekt wird nicht in einen Transaktions-Proxy eingebettet, was ausgesprochen schlecht wäre.

Obwohl es sich nur um Interfaces handelt, werden abstrakte Klassen ebenfalls als nicht konkret angesehen.

Also, wenn ich habe eine abstrakte Klasse

public abstract class BaseService{ 
//here is a concrete method 
@Transactional 
public void updateData{ 
//do stuff using dao layer 
} 

und eine konkrete Klasse, die die Klasse Jetzt

public class SpecialService extends BaseService{ 
//body of class 
} 

erstreckt, wenn ich specialService.updateData() von meiner Controller-Klasse nenne es transaktionale sein?

+0

Was passiert, wenn Sie versuchen? –

Antwort

8

Einräumung, die Sie tatsächlich Frühling Transaktionsmanagement richtig konfiguriert haben, mit @Transactional auf einer abstrakten Super wird Arbeit, da @Transactional selbst mit @Inherited kommentiert und von ihm Javadoc ist, die wir haben:

Zeigt an, dass eine Anmerkung Der Typ wird automatisch übernommen. Wenn eine vererbte Metaanmerkung für eine Anmerkung Deklaration vorhanden ist und der Benutzer den Anmerkungstyp für eine Deklaration der Klasse abfragt und die Klassendeklaration für diesen -Typ keine Anmerkung enthält, wird die Oberklasse der Klasse automatisch abgefragt der Annotationstyp. Dieser Prozess wird wiederholt, bis eine Annotation für diesen Typ gefunden wird oder der Anfang der Klassenhierarchie (Object) erreicht ist. Wenn keine Superklasse eine Annotation für diesen Typ aufweist, gibt die Abfrage an, dass die fragliche Klasse keine solche Annotation hat.

Beachten Sie, dass dieser Meta-Annotation-Typ keine Auswirkung hat, wenn der annotierte -Typ verwendet wird, um etwas anderes als eine Klasse zu kommentieren. Beachten Sie auch, dass diese Meta-Annotation nur dazu führt, dass Annotationen von Superklassen vererbt werden; Anmerkungen zu implementierten Schnittstellen haben keine Auswirkung.

Um zu sehen, eigentlich, dass @Transactional mit @Inherited Check kommentierten wird aus ist es Javadoc