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 e46ee28c2659d718d8a5e41830a15be0d110d63f..2c2eff5feb55e1e04e3ab885e79643759666976f 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(); } }