diff --git a/spring-context-support/src/main/java/org/springframework/cache/transaction/TransactionAwareCacheDecorator.java b/spring-context-support/src/main/java/org/springframework/cache/transaction/TransactionAwareCacheDecorator.java index ca193ee0d8..22fcaffd5f 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/transaction/TransactionAwareCacheDecorator.java +++ b/spring-context-support/src/main/java/org/springframework/cache/transaction/TransactionAwareCacheDecorator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import java.util.concurrent.Callable; import org.springframework.cache.Cache; import org.springframework.lang.Nullable; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -94,7 +94,7 @@ public class TransactionAwareCacheDecorator implements Cache { @Override public void put(final Object key, @Nullable final Object value) { if (TransactionSynchronizationManager.isSynchronizationActive()) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { TransactionAwareCacheDecorator.this.targetCache.put(key, value); @@ -115,7 +115,7 @@ public class TransactionAwareCacheDecorator implements Cache { @Override public void evict(final Object key) { if (TransactionSynchronizationManager.isSynchronizationActive()) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { TransactionAwareCacheDecorator.this.targetCache.evict(key); @@ -135,7 +135,7 @@ public class TransactionAwareCacheDecorator implements Cache { @Override public void clear() { if (TransactionSynchronizationManager.isSynchronizationActive()) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { targetCache.clear(); diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java index 3237042f3c..67c8338394 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.CannotGetJdbcConnectionException; import org.springframework.lang.Nullable; import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -466,7 +466,7 @@ public abstract class DataSourceUtils { * (e.g. when participating in a JtaTransactionManager transaction). * @see org.springframework.transaction.jta.JtaTransactionManager */ - private static class ConnectionSynchronization extends TransactionSynchronizationAdapter { + private static class ConnectionSynchronization implements TransactionSynchronization { private final ConnectionHolder connectionHolder; diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java index 84e5c3b1a5..8cbf9be0dd 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java @@ -44,7 +44,6 @@ import org.springframework.transaction.UnexpectedRollbackException; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; @@ -488,9 +487,7 @@ public class DataSourceTransactionManagerTests { protected void doInTransactionWithoutResult(TransactionStatus status) { } }); - TransactionSynchronizationManager.registerSynchronization( - new TransactionSynchronizationAdapter() { - }); + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {}); } }; diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/support/JdbcTransactionManagerTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/support/JdbcTransactionManagerTests.java index 79e6295995..2c6ff65cc5 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/support/JdbcTransactionManagerTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/support/JdbcTransactionManagerTests.java @@ -50,7 +50,6 @@ import org.springframework.transaction.UnexpectedRollbackException; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; @@ -494,9 +493,7 @@ public class JdbcTransactionManagerTests { protected void doInTransactionWithoutResult(TransactionStatus status) { } }); - TransactionSynchronizationManager.registerSynchronization( - new TransactionSynchronizationAdapter() { - }); + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {}); } }; diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringFlushSynchronization.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringFlushSynchronization.java index 944c4a2635..9457985188 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringFlushSynchronization.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/SpringFlushSynchronization.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ package org.springframework.orm.hibernate5; import org.hibernate.Session; import org.springframework.lang.Nullable; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; /** * Simple synchronization adapter that propagates a {@code flush()} call @@ -28,7 +28,7 @@ import org.springframework.transaction.support.TransactionSynchronizationAdapter * @author Juergen Hoeller * @since 4.2 */ -public class SpringFlushSynchronization extends TransactionSynchronizationAdapter { +public class SpringFlushSynchronization implements TransactionSynchronization { private final Session session; diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java index 668a8e023b..3a53b2cb9a 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/JpaTransactionManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.TransactionSystemException; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionCallbackWithoutResult; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; @@ -572,7 +572,7 @@ public class JpaTransactionManagerTests { @Override public Object doInTransaction(TransactionStatus status) { EntityManagerFactoryUtils.getTransactionalEntityManager(factory).flush(); - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { tt.execute(new TransactionCallback() { diff --git a/spring-tx/src/main/java/org/springframework/transaction/event/ApplicationListenerMethodTransactionalAdapter.java b/spring-tx/src/main/java/org/springframework/transaction/event/ApplicationListenerMethodTransactionalAdapter.java index b39e8c3520..67dd3009b8 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/event/ApplicationListenerMethodTransactionalAdapter.java +++ b/spring-tx/src/main/java/org/springframework/transaction/event/ApplicationListenerMethodTransactionalAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,6 @@ import org.springframework.context.event.EventListener; import org.springframework.context.event.GenericApplicationListener; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; /** @@ -84,7 +83,7 @@ class ApplicationListenerMethodTransactionalAdapter extends ApplicationListenerM } - private static class TransactionSynchronizationEventAdapter extends TransactionSynchronizationAdapter { + private static class TransactionSynchronizationEventAdapter implements TransactionSynchronization { private final ApplicationListenerMethodAdapter listener; diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/SimpleTransactionScope.java b/spring-tx/src/main/java/org/springframework/transaction/support/SimpleTransactionScope.java index 38c93de5b3..01174f72b1 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/SimpleTransactionScope.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/SimpleTransactionScope.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -98,7 +98,7 @@ public class SimpleTransactionScope implements Scope { } - private class CleanupSynchronization extends TransactionSynchronizationAdapter { + private class CleanupSynchronization implements TransactionSynchronization { private final ScopedObjectsHolder scopedObjects; diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronization.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronization.java index 9d21ddb01f..9e337f669f 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronization.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronization.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package org.springframework.transaction.support; import java.io.Flushable; +import org.springframework.core.Ordered; + /** * Interface for transaction synchronization callbacks. * Supported by AbstractPlatformTransactionManager. @@ -29,13 +31,18 @@ import java.io.Flushable; *

System synchronizations performed by Spring itself use specific order values, * allowing for fine-grained interaction with their execution order (if necessary). * + *

Implements the {@link Ordered} interface to enable the execution order of + * synchronizations to be controlled declaratively, as of 5.3. The default + * {@link #getOrder() order} is {@link Ordered#LOWEST_PRECEDENCE}, indicating + * late execution; return a lower value for earlier execution. + * * @author Juergen Hoeller * @since 02.06.2003 * @see TransactionSynchronizationManager * @see AbstractPlatformTransactionManager * @see org.springframework.jdbc.datasource.DataSourceUtils#CONNECTION_SYNCHRONIZATION_ORDER */ -public interface TransactionSynchronization extends Flushable { +public interface TransactionSynchronization extends Ordered, Flushable { /** Completion status in case of proper commit. */ int STATUS_COMMITTED = 0; @@ -47,6 +54,11 @@ public interface TransactionSynchronization extends Flushable { int STATUS_UNKNOWN = 2; + @Override + default int getOrder() { + return Ordered.LOWEST_PRECEDENCE; + } + /** * Suspend this synchronization. * Supposed to unbind resources from TransactionSynchronizationManager if managing any. diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationAdapter.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationAdapter.java index 49cbe02ed4..4eb3d678a2 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationAdapter.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,10 @@ import org.springframework.core.Ordered; * * @author Juergen Hoeller * @since 22.01.2004 + * @deprecated as of 5.3, in favor of the default methods on the + * {@link TransactionSynchronization} interface */ +@Deprecated public abstract class TransactionSynchronizationAdapter implements TransactionSynchronization, Ordered { @Override diff --git a/spring-tx/src/test/java/org/springframework/transaction/JtaTransactionManagerTests.java b/spring-tx/src/test/java/org/springframework/transaction/JtaTransactionManagerTests.java index ef2b461a21..8666e6155b 100644 --- a/spring-tx/src/test/java/org/springframework/transaction/JtaTransactionManagerTests.java +++ b/spring-tx/src/test/java/org/springframework/transaction/JtaTransactionManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,6 @@ import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; @@ -887,7 +886,7 @@ public class JtaTransactionManagerTests { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // something transactional - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_ROLLED_BACK).as("Correct completion status").isTrue(); @@ -931,7 +930,7 @@ public class JtaTransactionManagerTests { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // something transactional - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_ROLLED_BACK).as("Correct completion status").isTrue(); @@ -976,7 +975,7 @@ public class JtaTransactionManagerTests { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // something transactional - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_UNKNOWN).as("Correct completion status").isTrue(); @@ -1003,7 +1002,7 @@ public class JtaTransactionManagerTests { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // something transactional - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_UNKNOWN).as("Correct completion status").isTrue(); @@ -1030,7 +1029,7 @@ public class JtaTransactionManagerTests { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // something transactional - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_UNKNOWN).as("Correct completion status").isTrue(); @@ -1055,7 +1054,7 @@ public class JtaTransactionManagerTests { tt.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_UNKNOWN).as("Correct completion status").isTrue(); @@ -1100,7 +1099,7 @@ public class JtaTransactionManagerTests { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { status.setRollbackOnly(); - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCompletion(int status) { assertThat(status == TransactionSynchronization.STATUS_UNKNOWN).as("Correct completion status").isTrue(); diff --git a/spring-tx/src/test/java/org/springframework/transaction/event/TransactionalEventListenerTests.java b/spring-tx/src/test/java/org/springframework/transaction/event/TransactionalEventListenerTests.java index 98b3b22318..c75f4ac378 100644 --- a/spring-tx/src/test/java/org/springframework/transaction/event/TransactionalEventListenerTests.java +++ b/spring-tx/src/test/java/org/springframework/transaction/event/TransactionalEventListenerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionSynchronizationAdapter; +import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.testfixture.CallCountingTransactionManager; @@ -583,7 +583,7 @@ public class TransactionalEventListenerTests { } - static class EventTransactionSynchronization extends TransactionSynchronizationAdapter { + static class EventTransactionSynchronization implements TransactionSynchronization { private final int order;