2017-05-03 4 views
1

@EnableTransactionManagement scannen alle Spring Beans für @Transactional, um Transaktionsverwaltung bereitzustellen.Aktivieren Sie @Transactional nur für vordefinierte Pakete mit Java Config

Ist es möglich, eine Liste der Pakete zur Verfügung zu stellen, die gescannt werden?

Zum Beispiel: Ich möchte Unterstützung haben für @Transactional in Paket a.b.c aber ich möchte Klassen mit @Transactionalx.y.z in Paket markiert ignorieren.

Der Grund für solche wird Anforderung ist 3-Parteien-lib. Es hat @Transactional(readonly=false) auf fast jeder Klasse, aber es führt nur In-Memory-Operationen. Jedes Mal, wenn ich diese API anrufe, erhält die Feder die DB-Verbindung, und das muss ich wirklich vermeiden. Ich möchte diese ganze Bibliothek vom Transaktionsmanagement ausschließen. Ich kann auch keinen separaten Federkontext für diese Lib erstellen.

+0

Können Sie nicht einfach Ausschlussfilter in Ihrem eigenen Paket hinzufügen, um die 3-Parteien-Klassen zu ignorieren? Siehe http://www.concretepage.com/spring/spring-component-scan-include-and-exclude-filter-example-using-javaconfg-and-xml-with-annotation-assignable-aspect-and-regex-filter -Typen – StanislavL

+0

Nein, weil diese auch Frühlingsbohnen sind –

+1

Sieht aus, als ob Sie eigene AnnotationTransactionAttributeSource benötigen, wo Sie TransactionAnnotationParser bereitstellen können, um die Klassen zu überspringen, aber ich weiß nicht, wie Sie die Quelle richtig hinzufügen. Siehe http://stackoverflow.com/questions/8316747/using-custom-annotationtransactionattributeource-with-txannotation-driven – StanislavL

Antwort

0

Soweit ich weiß, Sie Ihre individuellen Transaktionsmanager in der Konfigurationsdatei definieren: Beispiel:

<tx:annotation-driven transaction-manager="txManagerRest" proxy-target-class="true"/> 

<bean id="txManagerRest" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSourceRest"/> 
</bean> 

Dann können Sie in den Klassen setzen Sie diese individuellen Transaktionsmanager wie wollen:

@Transactional("txName") 

oder

@Transactional(value = "txName") 

Auf diese Weise Sie b würden e mit Transaktion, wo Sie wollen. Darüber hinaus können Sie jetzt so viele Transaktionsmanager haben, wie Sie möchten, und sie überall dort verwenden, wo Sie sie benötigen.

+0

Mit @Transacitonal in der 3-Parteien-Bibliothek markierte Methoden würden immer noch den Transaktionsmanager benötigen, da mindestens einer aktiv ist. An Ich kann diesen Code nicht ändern. –

Verwandte Themen