diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java index 5fb19c6453..d9a5a76320 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java @@ -68,21 +68,21 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor, private final Set beanOverrideHandlers; - private final BeanOverrideRegistrar beanOverrideRegistrar; + private final BeanOverrideRegistry beanOverrideRegistry; /** * Create a new {@code BeanOverrideBeanFactoryPostProcessor} with the supplied * set of {@link BeanOverrideHandler BeanOverrideHandlers} to process, using - * the given {@link BeanOverrideRegistrar}. + * the given {@link BeanOverrideRegistry}. * @param beanOverrideHandlers the bean override handlers to process - * @param beanOverrideRegistrar the registrar used to track bean override handlers + * @param beanOverrideRegistry the registry used to track bean override handlers */ BeanOverrideBeanFactoryPostProcessor(Set beanOverrideHandlers, - BeanOverrideRegistrar beanOverrideRegistrar) { + BeanOverrideRegistry beanOverrideRegistry) { this.beanOverrideHandlers = beanOverrideHandlers; - this.beanOverrideRegistrar = beanOverrideRegistrar; + this.beanOverrideRegistry = beanOverrideRegistry; } @@ -193,7 +193,7 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Object override = handler.createOverrideInstance(beanName, existingBeanDefinition, null); handler.trackOverrideInstance(override, beanFactory); - this.beanOverrideRegistrar.registerBeanOverrideHandler(handler, beanName); + this.beanOverrideRegistry.registerBeanOverrideHandler(handler, beanName); // Now we have an instance (the override) that we can manually register as a singleton. // @@ -245,8 +245,7 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor, } } validateBeanDefinition(beanFactory, beanName); - this.beanOverrideRegistrar.registerWrappingBeanOverrideHandler(handler, beanName); - this.beanOverrideRegistrar.registerBeanOverrideHandler(handler, beanName); + this.beanOverrideRegistry.registerBeanOverrideHandler(handler, beanName); } @Nullable diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java index 134b493e17..412a6691b3 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java @@ -34,8 +34,8 @@ import org.springframework.test.context.MergedContextConfiguration; */ class BeanOverrideContextCustomizer implements ContextCustomizer { - static final String REGISTRAR_BEAN_NAME = - "org.springframework.test.context.bean.override.internalBeanOverrideRegistrar"; + static final String REGISTRY_BEAN_NAME = + "org.springframework.test.context.bean.override.internalBeanOverrideRegistry"; private static final String INFRASTRUCTURE_BEAN_NAME = "org.springframework.test.context.bean.override.internalBeanOverridePostProcessor"; @@ -59,12 +59,12 @@ class BeanOverrideContextCustomizer implements ContextCustomizer { // the BeanOverrideBeanFactoryPostProcessor as a singleton is a requirement for // AOT processing, since a bean definition cannot be generated for the // Set argument that it accepts in its constructor. - BeanOverrideRegistrar beanOverrideRegistrar = new BeanOverrideRegistrar(beanFactory); - beanFactory.registerSingleton(REGISTRAR_BEAN_NAME, beanOverrideRegistrar); + BeanOverrideRegistry beanOverrideRegistry = new BeanOverrideRegistry(beanFactory); + beanFactory.registerSingleton(REGISTRY_BEAN_NAME, beanOverrideRegistry); beanFactory.registerSingleton(INFRASTRUCTURE_BEAN_NAME, - new BeanOverrideBeanFactoryPostProcessor(this.handlers, beanOverrideRegistrar)); + new BeanOverrideBeanFactoryPostProcessor(this.handlers, beanOverrideRegistry)); beanFactory.registerSingleton(EARLY_INFRASTRUCTURE_BEAN_NAME, - new WrapEarlyBeanPostProcessor(beanOverrideRegistrar)); + new WrapEarlyBeanPostProcessor(beanOverrideRegistry)); } Set getBeanOverrideHandlers() { diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistry.java similarity index 66% rename from spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java rename to spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistry.java index 54ab0cc156..0d59ecfd5a 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistry.java @@ -20,7 +20,6 @@ import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.util.Assert; @@ -36,16 +35,16 @@ import org.springframework.util.StringUtils; * @author Sam Brannen * @since 6.2 */ -class BeanOverrideRegistrar { +class BeanOverrideRegistry { - private final Map beanNameRegistry = new HashMap<>(); + private final Map handlerToBeanNameMap = new HashMap<>(); private final Map wrappingBeanOverrideHandlers = new HashMap<>(); private final ConfigurableBeanFactory beanFactory; - BeanOverrideRegistrar(ConfigurableBeanFactory beanFactory) { + BeanOverrideRegistry(ConfigurableBeanFactory beanFactory) { Assert.notNull(beanFactory, "ConfigurableBeanFactory must not be null"); this.beanFactory = beanFactory; } @@ -53,37 +52,39 @@ class BeanOverrideRegistrar { /** * Register the provided {@link BeanOverrideHandler} and associate it with the * given {@code beanName}. + *

Also associates a {@linkplain BeanOverrideStrategy#WRAP "wrapping"} handler + * with the given {@code beanName}, allowing for subsequent wrapping of the + * bean via {@link #wrapBeanIfNecessary(Object, String)}. */ void registerBeanOverrideHandler(BeanOverrideHandler handler, String beanName) { - this.beanNameRegistry.put(handler, beanName); - } - - /** - * Register the provided {@link BeanOverrideHandler} as a - * {@linkplain BeanOverrideStrategy#WRAP "wrapping"} handler and associate it - * with the given {@code beanName}, allowing for subsequent wrapping of the - * bean via {@link #wrapIfNecessary(Object, String)}. - */ - void registerWrappingBeanOverrideHandler(BeanOverrideHandler handler, String beanName) { - this.wrappingBeanOverrideHandlers.put(beanName, handler); - } - - /** - * Check {@linkplain #registerWrappingBeanOverrideHandler(BeanOverrideHandler, String) - * wrapping handler} records and use the corresponding {@link BeanOverrideHandler} - * to create an override instance by wrapping the provided bean, if relevant. - */ - Object wrapIfNecessary(Object bean, String beanName) throws BeansException { - BeanOverrideHandler handler = this.wrappingBeanOverrideHandlers.get(beanName); - if (handler != null && handler.getStrategy() == BeanOverrideStrategy.WRAP) { - bean = handler.createOverrideInstance(beanName, null, bean); - handler.trackOverrideInstance(bean, this.beanFactory); + this.handlerToBeanNameMap.put(handler, beanName); + if (handler.getStrategy() == BeanOverrideStrategy.WRAP) { + this.wrappingBeanOverrideHandlers.put(beanName, handler); } + } + + /** + * Use the registered {@linkplain BeanOverrideStrategy#WRAP "wrapping"} + * {@link BeanOverrideHandler} to create an override instance by wrapping the + * supplied bean. + *

If no suitable {@code BeanOverrideHandler} has been registered, this + * method returns the supplied bean unmodified. + * @see #registerBeanOverrideHandler(BeanOverrideHandler, String) + */ + Object wrapBeanIfNecessary(Object bean, String beanName) { + if (!this.wrappingBeanOverrideHandlers.containsKey(beanName)) { + return bean; + } + BeanOverrideHandler handler = this.wrappingBeanOverrideHandlers.get(beanName); + Assert.state(handler != null, + () -> "Failed to find wrapping BeanOverrideHandler for bean '" + beanName + "'"); + bean = handler.createOverrideInstance(beanName, null, bean); + handler.trackOverrideInstance(bean, this.beanFactory); return bean; } void inject(Object target, BeanOverrideHandler handler) { - String beanName = this.beanNameRegistry.get(handler); + String beanName = this.handlerToBeanNameMap.get(handler); Assert.state(StringUtils.hasLength(beanName), () -> "No bean found for BeanOverrideHandler: " + handler); inject(handler.getField(), target, beanName); diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java index 9861ef587c..4b9e77369a 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java @@ -77,14 +77,14 @@ public class BeanOverrideTestExecutionListener extends AbstractTestExecutionList * a corresponding bean override instance. */ private static void injectFields(TestContext testContext) { - List handlerList = BeanOverrideHandler.forTestClass(testContext.getTestClass()); - if (!handlerList.isEmpty()) { + List handlers = BeanOverrideHandler.forTestClass(testContext.getTestClass()); + if (!handlers.isEmpty()) { Object testInstance = testContext.getTestInstance(); - BeanOverrideRegistrar registrar = testContext.getApplicationContext() - .getBean(BeanOverrideContextCustomizer.REGISTRAR_BEAN_NAME, BeanOverrideRegistrar.class); + BeanOverrideRegistry beanOverrideRegistry = testContext.getApplicationContext() + .getBean(BeanOverrideContextCustomizer.REGISTRY_BEAN_NAME, BeanOverrideRegistry.class); - for (BeanOverrideHandler handler : handlerList) { - registrar.inject(testInstance, handler); + for (BeanOverrideHandler handler : handlers) { + beanOverrideRegistry.inject(testInstance, handler); } } } diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/WrapEarlyBeanPostProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/WrapEarlyBeanPostProcessor.java index bee9588dec..1164c89ce6 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/WrapEarlyBeanPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/WrapEarlyBeanPostProcessor.java @@ -39,10 +39,10 @@ class WrapEarlyBeanPostProcessor implements SmartInstantiationAwareBeanPostProce private final Map earlyReferences = new ConcurrentHashMap<>(16); - private final BeanOverrideRegistrar overrideRegistrar; + private final BeanOverrideRegistry beanOverrideRegistry; - WrapEarlyBeanPostProcessor(BeanOverrideRegistrar registrar) { - this.overrideRegistrar = registrar; + WrapEarlyBeanPostProcessor(BeanOverrideRegistry beanOverrideRegistry) { + this.beanOverrideRegistry = beanOverrideRegistry; } @Override @@ -56,7 +56,7 @@ class WrapEarlyBeanPostProcessor implements SmartInstantiationAwareBeanPostProce return bean; } this.earlyReferences.put(getCacheKey(bean, beanName), bean); - return this.overrideRegistrar.wrapIfNecessary(bean, beanName); + return this.beanOverrideRegistry.wrapBeanIfNecessary(bean, beanName); } @Override @@ -65,7 +65,7 @@ class WrapEarlyBeanPostProcessor implements SmartInstantiationAwareBeanPostProce return bean; } if (this.earlyReferences.remove(getCacheKey(bean, beanName)) != bean) { - return this.overrideRegistrar.wrapIfNecessary(bean, beanName); + return this.beanOverrideRegistry.wrapBeanIfNecessary(bean, beanName); } return bean; } diff --git a/spring-test/src/test/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessorTests.java b/spring-test/src/test/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessorTests.java index 505f246710..4b14b200e4 100644 --- a/spring-test/src/test/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessorTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessorTests.java @@ -48,7 +48,7 @@ import static org.mockito.Mockito.mock; /** * Tests for {@link BeanOverrideBeanFactoryPostProcessor} combined with a - * {@link BeanOverrideRegistrar}. + * {@link BeanOverrideRegistry}. * * @author Simon Baslé * @author Stephane Nicoll