From eb348c368e3a8ec0cf7c2ef77d3776c77b9a68f7 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 1/8] Add a palin method getPlainTargetBeanName Add a palin method to facilitate the use in situations where the current targetSource information is simply obtained. There is no need to be restricted by the assertions in the original getTargetBeanName method. This is very friendly to the toString method Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../target/AbstractBeanFactoryBasedTargetSource.java | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 409d38818960..e70b5bf10574 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 @@ -94,6 +94,17 @@ public String getTargetBeanName() { return this.targetBeanName; } + /** + * Return the name of the target bean in the factory. + * If the configuration has not been completed yet, null can be returned + * If it's just for obtaining simple basic information, using it is very friendly. + * For example, toString().However, if strict non-null judgment is required, + * please use {@link #getTargetBeanName} + */ + public String getPlainTargetBeanName() { + return this.targetBeanName; + } + /** * Specify the target class explicitly, to avoid any kind of access to the * target bean (for example, to avoid initialization of a FactoryBean instance). From bbd255b2edf50263732079840a4e7f755fdcd0a1 Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:30:40 +0800 Subject: [PATCH 2/8] Using getPlainTargetBeanName() instead of getTargetBeanName Using getPlainTargetBeanName() instead of getTargetBeanName avoids the influence of assertions on toString Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../org/springframework/aop/target/PrototypeTargetSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b0d5aabc501a..ad6fe7184a55 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 void releaseTarget(Object target) { @Override public String toString() { - return "PrototypeTargetSource for target bean with name '" + getTargetBeanName() + "'"; + return "PrototypeTargetSource for target bean with name '" + getPlainTargetBeanName() + "'"; } } From 58e20f2e19e48e62d7dbba6b3c0019fbee04f271 Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:57:19 +0800 Subject: [PATCH 3/8] Using getPlainTargetBeanName() instead of getTargetBeanName Using getPlainTargetBeanName() instead of getTargetBeanName avoids the impact of assertions on the logger Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../springframework/aop/target/ThreadLocalTargetSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 40a7d1fd3096..d3083d605e45 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() + " '" + getPlainTargetBeanName() + "'"; } }; @@ -86,7 +86,7 @@ public Object getTarget() throws BeansException { 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 '" + getPlainTargetBeanName() + "' bound to thread: " + "creating one and binding it to thread '" + Thread.currentThread().getName() + "'"); } // Associate target with ThreadLocal. From 2751c6a178dd9a092282e499e4e25c6f1db81ec2 Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Wed, 9 Jul 2025 01:01:00 +0800 Subject: [PATCH 4/8] Using getPlainTargetBeanName() instead of getTargetBeanName Using getPlainTargetBeanName() instead of getTargetBeanName avoids the impact of assertions on the logger Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../aop/target/AbstractPrototypeBasedTargetSource.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 d3012e71597f..1d515e86e3eb 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 void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (!beanFactory.isPrototype(getTargetBeanName())) { throw new BeanDefinitionStoreException( "Cannot use prototype-based TargetSource against non-prototype bean with name '" + - getTargetBeanName() + "': instances would not be independent"); + getPlainTargetBeanName() + "': instances would not be independent"); } } @@ -64,7 +64,7 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException { */ protected Object newPrototypeInstance() throws BeansException { if (logger.isDebugEnabled()) { - logger.debug("Creating new instance of bean '" + getTargetBeanName() + "'"); + logger.debug("Creating new instance of bean '" + getPlainTargetBeanName() + "'"); } return getBeanFactory().getBean(getTargetBeanName()); } @@ -75,7 +75,7 @@ protected Object newPrototypeInstance() throws BeansException { */ protected void destroyPrototypeInstance(Object target) { if (logger.isDebugEnabled()) { - logger.debug("Destroying instance of bean '" + getTargetBeanName() + "'"); + logger.debug("Destroying instance of bean '" + getPlainTargetBeanName() + "'"); } if (getBeanFactory() instanceof ConfigurableBeanFactory cbf) { cbf.destroyBean(getTargetBeanName(), target); @@ -85,7 +85,7 @@ else if (target instanceof DisposableBean disposableBean) { 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 '" + getPlainTargetBeanName() + "' threw an exception", ex); } } } From bb168618c179144ad2ba8b4f4dbd4e3f144d8d22 Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Fri, 11 Jul 2025 02:06:41 +0800 Subject: [PATCH 5/8] Change the modifier of targetBeanName from private to protected Change the modifier of targetBeanName from private to protected to facilitate direct access through this.targetBeanName where no assertion is needed. Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../AbstractBeanFactoryBasedTargetSource.java | 13 +------------ 1 file changed, 1 insertion(+), 12 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 e70b5bf10574..f04c1c735579 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 @@ -60,7 +60,7 @@ public abstract class AbstractBeanFactoryBasedTargetSource implements TargetSour protected final transient Log logger = LogFactory.getLog(getClass()); /** Name of the target bean we will create on each invocation. */ - private @Nullable String targetBeanName; + protected @Nullable String targetBeanName; /** Class of the target. */ private volatile @Nullable Class targetClass; @@ -93,17 +93,6 @@ public String getTargetBeanName() { Assert.state(this.targetBeanName != null, "Target bean name not set"); return this.targetBeanName; } - - /** - * Return the name of the target bean in the factory. - * If the configuration has not been completed yet, null can be returned - * If it's just for obtaining simple basic information, using it is very friendly. - * For example, toString().However, if strict non-null judgment is required, - * please use {@link #getTargetBeanName} - */ - public String getPlainTargetBeanName() { - return this.targetBeanName; - } /** * Specify the target class explicitly, to avoid any kind of access to the From d5018940e84faa6a063920bab17de63d4ee5aa6a Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Fri, 11 Jul 2025 02:16:54 +0800 Subject: [PATCH 6/8] directly access targetBeanName using this.targetBeanName Since the modifier has been changed to protected, you can directly access targetBeanName using this.targetBeanName Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../aop/target/AbstractPrototypeBasedTargetSource.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 1d515e86e3eb..3051754c483f 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 void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (!beanFactory.isPrototype(getTargetBeanName())) { throw new BeanDefinitionStoreException( "Cannot use prototype-based TargetSource against non-prototype bean with name '" + - getPlainTargetBeanName() + "': instances would not be independent"); + this.targetBeanName + "': instances would not be independent"); } } @@ -64,7 +64,7 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException { */ protected Object newPrototypeInstance() throws BeansException { if (logger.isDebugEnabled()) { - logger.debug("Creating new instance of bean '" + getPlainTargetBeanName() + "'"); + logger.debug("Creating new instance of bean '" + this.targetBeanName + "'"); } return getBeanFactory().getBean(getTargetBeanName()); } @@ -75,7 +75,7 @@ protected Object newPrototypeInstance() throws BeansException { */ protected void destroyPrototypeInstance(Object target) { if (logger.isDebugEnabled()) { - logger.debug("Destroying instance of bean '" + getPlainTargetBeanName() + "'"); + logger.debug("Destroying instance of bean '" + this.targetBeanName + "'"); } if (getBeanFactory() instanceof ConfigurableBeanFactory cbf) { cbf.destroyBean(getTargetBeanName(), target); @@ -85,7 +85,7 @@ else if (target instanceof DisposableBean disposableBean) { disposableBean.destroy(); } catch (Throwable ex) { - logger.warn("Destroy method on bean with name '" + getPlainTargetBeanName() + "' threw an exception", ex); + logger.warn("Destroy method on bean with name '" + this.targetBeanName + "' threw an exception", ex); } } } From 32eff634c1561ad0efaba8e1edb5b8fe5e1040ea Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Fri, 11 Jul 2025 02:24:48 +0800 Subject: [PATCH 7/8] directly access targetBeanName using this.targetBeanName Since the modifier has been changed to protected, you can directly access targetBeanName using this.targetBeanName Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../org/springframework/aop/target/PrototypeTargetSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ad6fe7184a55..edfb435943eb 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 void releaseTarget(Object target) { @Override public String toString() { - return "PrototypeTargetSource for target bean with name '" + getPlainTargetBeanName() + "'"; + return "PrototypeTargetSource for target bean with name '" + this.targetBeanName + "'"; } } From 434e5b7fb4c2a4cbe273ac5a1dd1dd8e55ae0b78 Mon Sep 17 00:00:00 2001 From: chenggwang <90715678+chenggwang@users.noreply.github.com> Date: Fri, 11 Jul 2025 02:31:17 +0800 Subject: [PATCH 8/8] directly access targetBeanName using this.targetBeanName Since the modifier has been changed to protected, you can directly access targetBeanName using this.targetBeanName Signed-off-by: chenggwang <90715678+chenggwang@users.noreply.github.com> --- .../springframework/aop/target/ThreadLocalTargetSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 d3083d605e45..bea2e0a358e6 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() + " '" + getPlainTargetBeanName() + "'"; + return super.toString() + " '" + this.targetBeanName + "'"; } }; @@ -86,7 +86,7 @@ public Object getTarget() throws BeansException { Object target = this.targetInThread.get(); if (target == null) { if (logger.isDebugEnabled()) { - logger.debug("No target for prototype '" + getPlainTargetBeanName() + "' 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.