From fd9d518c36081b3233326bfb95d79f2087c3edc6 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 22 Jun 2016 14:41:20 +0200 Subject: [PATCH] Avoid potential deadlock in AbstractBeanFactoryPointcutAdvisor Issue: SPR-14388 --- .../AbstractBeanFactoryPointcutAdvisor.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java b/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java index e46ee28c26..2c2eff5feb 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 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. @@ -23,6 +23,7 @@ import org.aopalliance.aop.Advice; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.util.Assert; /** @@ -72,8 +73,23 @@ public abstract class AbstractBeanFactoryPointcutAdvisor extends AbstractPointcu @Override public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; + resetAdviceMonitor(); } + private void resetAdviceMonitor() { + if (this.beanFactory instanceof ConfigurableBeanFactory) { + this.adviceMonitor = ((ConfigurableBeanFactory) this.beanFactory).getSingletonMutex(); + } + else { + this.adviceMonitor = new Object(); + } + } + + /** + * Specify a particular instance of the target advice directly, + * avoiding lazy resolution in {@link #getAdvice()}. + * @since 3.1 + */ public void setAdvice(Advice advice) { synchronized (this.adviceMonitor) { this.advice = advice; @@ -93,7 +109,15 @@ public abstract class AbstractBeanFactoryPointcutAdvisor extends AbstractPointcu @Override public String toString() { - return getClass().getName() + ": advice bean '" + getAdviceBeanName() + "'"; + StringBuilder sb = new StringBuilder(getClass().getName()); + sb.append(": advice "); + if (this.adviceBeanName != null) { + sb.append("bean '").append(this.adviceBeanName).append("'"); + } + else { + sb.append(this.advice); + } + return sb.toString(); } @@ -106,7 +130,7 @@ public abstract class AbstractBeanFactoryPointcutAdvisor extends AbstractPointcu ois.defaultReadObject(); // Initialize transient fields. - this.adviceMonitor = new Object(); + resetAdviceMonitor(); } } -- GitLab