Frage

Ich habe eine POJO-Klasse mit einer Methode kommentierte mit @Transactional

public class Pojo {

    @Transactional
    public void doInTransaction() {
        ...
    }
}

Frühling deklaratives Transaktionsmanagement basiert auf AOP, aber ich habe keine Erfahrung damit. Meine Frage ist: Ist es möglich, dass, wenn die (new Pojo).doInTransaction() allein Aufruf, Frühling wird eine Transaktion starten.

War es hilfreich?

Lösung

Frühling deklarative Transaktion Management basiert auf APO aber ich weiß nicht haben keine Erfahrung damit.

Ich würde empfehlen, mit ihm zu arbeiten, und Sie werden die Erfahrung mit der Transaktion Ratschläge erhalten AOP verwenden. Ein guter Ausgangspunkt ist hier .

Ist es möglich, dass, wenn der Aufruf (Neu Pojo) .doInTransaction () allein, Frühling wird eine Transaktion starten.

Nein, kann man nicht erwarten, Frühling bewusst eine Bohne sein, dass Sie manuell aufgerufen. Aber es klingt wie das Sie wollen, deklaratives Transaktionsmanagement zu vermeiden und programmatisches Transaktionsmanagement zu tun. Es eine Möglichkeit, dass mit Frühling zu tun ist, die Transaktionsvorlage . Ist das, was Sie suchen?

Andere Tipps

Es ist etwas möglich, aber auf eine umständliche Art und Weise: Sie müssen die AutowireCapableBeanFactory Mechanismus.

Hier ist eine Transaktionsklasse als Beispiel

public interface FooBar{
    void fooIze(Object foo);
}

public class FooBarImpl implements FooBar{
    @Transactional
    @Override
    public void fooIze(final Object foo){
        // do stuff here
    }
}

Und hier ist, wie wir es verwenden können:

public class FooService implements ApplicationContextAware{

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(
    final ApplicationContext applicationContext){
        this.applicationContext = applicationContext;
    }

    public void serviceMethod(){

        //declare variable as interface, initialize to implementation
        FooBar fooBar = new FooBarImpl();

        // try to use it, won't work, as it's not a proxy yet
        Object target = new Object[0];
        fooBar.fooIze(target); // no transaction

        // now let spring create the proxy and re-assign the variable
        // to the proxy:
        fooBar = // this is no longer an instance of FooBarImpl!!!
            (FooBar) applicationContext
                .getAutowireCapableBeanFactory()
                .applyBeanPostProcessorsAfterInitialization(fooBar,
                    "someBeanName");
        fooBar.fooIze(fooBar); // this time it should work

    }

}

Dies ist nicht eine bewährte Methode. Zum einen macht es die Anwendung des Spring Framework sehr bewusst und auch, verletzt er die Dependency Injection Prinzipien. Also diese nur verwenden, wenn es keine andere Möglichkeit ist!

Ja, es is möglich. Frühling tut nicht erfordert die Verwendung von dynamischen Proxies für @Transactional an der Arbeit. Stattdessen können Sie "true AOP" verwenden, wie AspectJ zur Verfügung gestellt.

Für die Details finden Sie unter http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-aspectj

Die Art und Weise Frühling Greift die Transaktion durch Annotation wird mit AOP, wie Sie gesagt haben. Der AOP-Bit wird mit Dynamic Proxies implementiert (siehe doc )

Also, um zu tun, damit Sie eine Instanz der Klasse (Pojo hier) durch die Federbehälter müssen abgerufen werden, da es funktioniert, Frühling kehren Sie eine dynamische Proxy über Ihre Pojo, die automatisch wird Surround jede kommentierte Methode mit dem Transaktions-Management-Code.

Wenn Sie einfach tun, um ein

Pojo p = new Pojo();
p.doInTransaction();

Frühling hat keine Rolle zu spielen und Ihr Methodenaufruf nicht innerhalb einer Transaktion sein.

so, was Sie tun müssen, ist so etwas wie dieses

ApplicationContext springContext = ...;
Pojo p = (Pojo) springContext.getBean("your.pojo.id");
p.doInTransaction();

Hinweis: Dies ist ein Beispiel, sollten Sie Dependency Injection bevorzugen statt Abrufen Ihren Bean manuell aus dem Kontext

Auf diese Weise und mit einem richtig konfigurierten Frühling Kontext, Frühling sollte Ihre Klassen Sucht nach Transaktions Anmerkung scannen und automatisch Ihre Bohnen in Anmerkung bewusst dynamische Proxies Instanzen gewickelt. Aus Ihrer Sicht, dass Sie werfen noch das Objekt zu Ihrer eigenen Klassen ändert nichts, aber wenn man den Klassennamen Ihrer Feder Kontext Pojo bean auszudrucken versuchen, werden Sie etwas als Proxy $ erhalten. .. und nicht Ihre ursprüngliche Klassennamen.

Haben Sie einen Blick auf diesen Link sowieso: Linktext

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top