Revise BeanOverrideRegistrar and rename it to BeanOverrideRegistry

This commit is contained in:
Sam Brannen
2024-10-16 17:14:19 +02:00
parent fa955934e7
commit da856de100
6 changed files with 54 additions and 54 deletions

View File

@@ -68,21 +68,21 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
private final Set<BeanOverrideHandler> 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<BeanOverrideHandler> 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

View File

@@ -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<BeanOverrideHandler> 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<BeanOverrideHandler> getBeanOverrideHandlers() {

View File

@@ -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<BeanOverrideHandler, String> beanNameRegistry = new HashMap<>();
private final Map<BeanOverrideHandler, String> handlerToBeanNameMap = new HashMap<>();
private final Map<String, BeanOverrideHandler> 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}.
* <p>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.
* <p>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);

View File

@@ -77,14 +77,14 @@ public class BeanOverrideTestExecutionListener extends AbstractTestExecutionList
* a corresponding bean override instance.
*/
private static void injectFields(TestContext testContext) {
List<BeanOverrideHandler> handlerList = BeanOverrideHandler.forTestClass(testContext.getTestClass());
if (!handlerList.isEmpty()) {
List<BeanOverrideHandler> 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);
}
}
}

View File

@@ -39,10 +39,10 @@ class WrapEarlyBeanPostProcessor implements SmartInstantiationAwareBeanPostProce
private final Map<String, Object> 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;
}