Revise BeanOverrideRegistrar and rename it to BeanOverrideRegistry
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user