Introduce spring.locking.strict=true flag for 6.1.x style bean creation locking

Closes gh-34303
This commit is contained in:
Juergen Hoeller
2025-03-25 17:08:55 +01:00
parent 20736bd06f
commit 6905dff660
3 changed files with 56 additions and 1 deletions

View File

@@ -76,6 +76,7 @@ import org.springframework.core.NamedThreadLocal;
import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered;
import org.springframework.core.ResolvableType;
import org.springframework.core.SpringProperties;
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
@@ -128,6 +129,17 @@ import org.springframework.util.StringUtils;
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
/**
* System property that instructs Spring to enforce string locking during bean creation,
* rather than the mix of strict and lenient locking that 6.2 applies by default. Setting
* this flag to "true" restores 6.1.x style locking in the entire pre-instantiation phase.
* @since 6.2.6
* @see #preInstantiateSingletons()
*/
public static final String STRICT_LOCKING_PROPERTY_NAME = "spring.locking.strict";
private static final boolean lenientLockingAllowed = !SpringProperties.getFlag(STRICT_LOCKING_PROPERTY_NAME);
@Nullable
private static Class<?> jakartaInjectProviderClass;
@@ -1031,7 +1043,8 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
@Override
@Nullable
protected Boolean isCurrentThreadAllowedToHoldSingletonLock() {
return (this.preInstantiationPhase ? this.preInstantiationThread.get() != PreInstantiation.BACKGROUND : null);
return (lenientLockingAllowed && this.preInstantiationPhase ?
this.preInstantiationThread.get() != PreInstantiation.BACKGROUND : null);
}
@Override