From 5aa15923cfc3e8ee7d67fbf2c634388fd42a7322 Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:24:38 +0800 Subject: [PATCH] Make targetBeanName field in AbstractBeanFactoryBasedTargetSource protected Prior to this commit, subclasses of AbstractBeanFactoryBasedTargetSource referenced the targetBeanName via getTargetBeanName() which throws an IllegalStateException if the targetBeanName has not yet been set. This commit changes the visibility of the targetBeanName field from private to protected in order to facilitate direct access through this.targetBeanName where no assertion is needed. By doing so, we avoid exceptions in logging and toString() implementations in subclasses. Closes gh-35172 Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> Co-authored-by: Sam Brannen <104798+sbrannen@users.noreply.github.com> --- .../aop/target/AbstractBeanFactoryBasedTargetSource.java | 2 +- .../aop/target/AbstractPrototypeBasedTargetSource.java | 8 ++++---- .../springframework/aop/target/PrototypeTargetSource.java | 2 +- .../aop/target/ThreadLocalTargetSource.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java b/spring-aop/src/main/java/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java index 040f272c78b..03e090706b1 100644 --- a/spring-aop/src/main/java/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java @@ -61,7 +61,7 @@ public abstract class AbstractBeanFactoryBasedTargetSource implements TargetSour /** Name of the target bean we will create on each invocation. */ @Nullable - private String targetBeanName; + protected String targetBeanName; /** Class of the target. */ @Nullable diff --git a/spring-aop/src/main/java/org/springframework/aop/target/AbstractPrototypeBasedTargetSource.java b/spring-aop/src/main/java/org/springframework/aop/target/AbstractPrototypeBasedTargetSource.java index d3012e71597..3051754c483 100644 --- a/spring-aop/src/main/java/org/springframework/aop/target/AbstractPrototypeBasedTargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/target/AbstractPrototypeBasedTargetSource.java @@ -54,7 +54,7 @@ public abstract class AbstractPrototypeBasedTargetSource extends AbstractBeanFac if (!beanFactory.isPrototype(getTargetBeanName())) { throw new BeanDefinitionStoreException( "Cannot use prototype-based TargetSource against non-prototype bean with name '" + - getTargetBeanName() + "': instances would not be independent"); + this.targetBeanName + "': instances would not be independent"); } } @@ -64,7 +64,7 @@ public abstract class AbstractPrototypeBasedTargetSource extends AbstractBeanFac */ protected Object newPrototypeInstance() throws BeansException { if (logger.isDebugEnabled()) { - logger.debug("Creating new instance of bean '" + getTargetBeanName() + "'"); + logger.debug("Creating new instance of bean '" + this.targetBeanName + "'"); } return getBeanFactory().getBean(getTargetBeanName()); } @@ -75,7 +75,7 @@ public abstract class AbstractPrototypeBasedTargetSource extends AbstractBeanFac */ protected void destroyPrototypeInstance(Object target) { if (logger.isDebugEnabled()) { - logger.debug("Destroying instance of bean '" + getTargetBeanName() + "'"); + logger.debug("Destroying instance of bean '" + this.targetBeanName + "'"); } if (getBeanFactory() instanceof ConfigurableBeanFactory cbf) { cbf.destroyBean(getTargetBeanName(), target); @@ -85,7 +85,7 @@ public abstract class AbstractPrototypeBasedTargetSource extends AbstractBeanFac disposableBean.destroy(); } catch (Throwable ex) { - logger.warn("Destroy method on bean with name '" + getTargetBeanName() + "' threw an exception", ex); + logger.warn("Destroy method on bean with name '" + this.targetBeanName + "' threw an exception", ex); } } } diff --git a/spring-aop/src/main/java/org/springframework/aop/target/PrototypeTargetSource.java b/spring-aop/src/main/java/org/springframework/aop/target/PrototypeTargetSource.java index b0d5aabc501..edfb435943e 100644 --- a/spring-aop/src/main/java/org/springframework/aop/target/PrototypeTargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/target/PrototypeTargetSource.java @@ -54,7 +54,7 @@ public class PrototypeTargetSource extends AbstractPrototypeBasedTargetSource { @Override public String toString() { - return "PrototypeTargetSource for target bean with name '" + getTargetBeanName() + "'"; + return "PrototypeTargetSource for target bean with name '" + this.targetBeanName + "'"; } } diff --git a/spring-aop/src/main/java/org/springframework/aop/target/ThreadLocalTargetSource.java b/spring-aop/src/main/java/org/springframework/aop/target/ThreadLocalTargetSource.java index 40a7d1fd309..a01bc446b7e 100644 --- a/spring-aop/src/main/java/org/springframework/aop/target/ThreadLocalTargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/target/ThreadLocalTargetSource.java @@ -61,7 +61,7 @@ public class ThreadLocalTargetSource extends AbstractPrototypeBasedTargetSource new NamedThreadLocal<>("Thread-local instance of bean") { @Override public String toString() { - return super.toString() + " '" + getTargetBeanName() + "'"; + return super.toString() + " '" + targetBeanName + "'"; } }; @@ -86,7 +86,7 @@ public class ThreadLocalTargetSource extends AbstractPrototypeBasedTargetSource Object target = this.targetInThread.get(); if (target == null) { if (logger.isDebugEnabled()) { - logger.debug("No target for prototype '" + getTargetBeanName() + "' bound to thread: " + + logger.debug("No target for prototype '" + this.targetBeanName + "' bound to thread: " + "creating one and binding it to thread '" + Thread.currentThread().getName() + "'"); } // Associate target with ThreadLocal.