From fd7153ffbb151369fd9876b9063864d8e0d7f977 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 16 Dec 2014 16:26:02 +0100 Subject: [PATCH] Do not retain cache transaction managers Previously, cache transaction managers may be retained outside the boundaries of an application context with AspectJ since an aspect is basically a singleton for the current class loader. This commit adds a "clearTransactionManagerCache" that is similar to the "clearMetadataCache" introduced in CacheAspectSupport: whenever the context is disposed, the cache is cleared to remove any reference to a transaction manager defined by that context. Issue: SPR-12518 --- .../transaction/aspectj/AbstractTransactionAspect.aj | 8 +++++++- .../transaction/interceptor/TransactionAspectSupport.java | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/spring-aspects/src/main/java/org/springframework/transaction/aspectj/AbstractTransactionAspect.aj b/spring-aspects/src/main/java/org/springframework/transaction/aspectj/AbstractTransactionAspect.aj index 29669b526d..49a197495e 100644 --- a/spring-aspects/src/main/java/org/springframework/transaction/aspectj/AbstractTransactionAspect.aj +++ b/spring-aspects/src/main/java/org/springframework/transaction/aspectj/AbstractTransactionAspect.aj @@ -19,6 +19,7 @@ package org.springframework.transaction.aspectj; import org.aspectj.lang.annotation.SuppressAjWarnings; import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.DisposableBean; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.transaction.interceptor.TransactionAttributeSource; @@ -44,7 +45,7 @@ import org.springframework.transaction.interceptor.TransactionAttributeSource; * @author Juergen Hoeller * @since 2.0 */ -public abstract aspect AbstractTransactionAspect extends TransactionAspectSupport { +public abstract aspect AbstractTransactionAspect extends TransactionAspectSupport implements DisposableBean { /** * Construct the aspect using the given transaction metadata retrieval strategy. @@ -56,6 +57,11 @@ public abstract aspect AbstractTransactionAspect extends TransactionAspectSuppor setTransactionAttributeSource(tas); } + @Override + public void destroy() { + clearTransactionManagerCache(); // An aspect is basically a singleton + } + @SuppressAjWarnings("adviceDidNotMatch") Object around(final Object txObject): transactionalMethodExecution(txObject) { MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature(); diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index dcc512f878..00679e9387 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -338,6 +338,13 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init } } + /** + * Clear the cached transaction managers. + */ + protected void clearTransactionManagerCache() { + this.transactionManagerCache.clear(); + } + /** * Determine the specific transaction manager to use for the given transaction. */