Skip to content

Commit

Permalink
Remove instance suppliers in bean definitions
Browse files Browse the repository at this point in the history
  • Loading branch information
mhalbritter committed Jan 18, 2023
1 parent 5fc0cbd commit f0b04d6
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

package org.springframework.boot.autoconfigure.web.reactive;

import java.util.function.Supplier;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
Expand Down Expand Up @@ -102,14 +100,13 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
return;
}
registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor",
WebServerFactoryCustomizerBeanPostProcessor.class,
WebServerFactoryCustomizerBeanPostProcessor::new);
WebServerFactoryCustomizerBeanPostProcessor.class);
}

private <T> void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name,
Class<T> beanClass, Supplier<T> instanceSupplier) {
Class<T> beanClass) {
if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass, instanceSupplier);
RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);
beanDefinition.setSynthetic(true);
registry.registerBeanDefinition(name, beanDefinition);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

package org.springframework.boot.autoconfigure.web.servlet;

import java.util.function.Supplier;

import jakarta.servlet.DispatcherType;
import jakarta.servlet.ServletRequest;

Expand Down Expand Up @@ -139,16 +137,15 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
return;
}
registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor",
WebServerFactoryCustomizerBeanPostProcessor.class,
WebServerFactoryCustomizerBeanPostProcessor::new);
WebServerFactoryCustomizerBeanPostProcessor.class);
registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor",
ErrorPageRegistrarBeanPostProcessor.class, ErrorPageRegistrarBeanPostProcessor::new);
ErrorPageRegistrarBeanPostProcessor.class);
}

private <T> void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name,
Class<T> beanClass, Supplier<T> instanceSupplier) {
Class<T> beanClass) {
if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass, instanceSupplier);
RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);
beanDefinition.setSynthetic(true);
registry.registerBeanDefinition(name, beanDefinition);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
private <T> void registerBeans(String location, String pattern, Class<T> type,
Function<Resource, T> beanSupplier, BeanDefinitionRegistry registry) {
for (Resource resource : getResources(location, pattern)) {
// TODO MH: How to fix that?
BeanDefinition beanDefinition = BeanDefinitionBuilder
.genericBeanDefinition(type, () -> beanSupplier.apply(resource)).getBeanDefinition();
registry.registerBeanDefinition(StringUtils.stripFilenameExtension(resource.getFilename()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ public static BoundConfigurationProperties get(ApplicationContext context) {
static void register(BeanDefinitionRegistry registry) {
Assert.notNull(registry, "Registry must not be null");
if (!registry.containsBeanDefinition(BEAN_NAME)) {
BeanDefinition definition = BeanDefinitionBuilder
.genericBeanDefinition(BoundConfigurationProperties.class, BoundConfigurationProperties::new)
BeanDefinition definition = BeanDefinitionBuilder.genericBeanDefinition(BoundConfigurationProperties.class)
.getBeanDefinition();
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(BEAN_NAME, definition);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.env.PropertySources;
import org.springframework.util.Assert;
import org.springframework.validation.Validator;
import org.springframework.validation.annotation.Validated;

Expand All @@ -64,8 +65,6 @@ class ConfigurationPropertiesBinder {

private static final String BEAN_NAME = "org.springframework.boot.context.internalConfigurationPropertiesBinder";

private static final String FACTORY_BEAN_NAME = "org.springframework.boot.context.internalConfigurationPropertiesBinderFactory";

private static final String VALIDATOR_BEAN_NAME = EnableConfigurationProperties.VALIDATOR_BEAN_NAME;

private final ApplicationContext applicationContext;
Expand Down Expand Up @@ -189,18 +188,9 @@ private Consumer<PropertyEditorRegistry> getPropertyEditorInitializer() {
}

static void register(BeanDefinitionRegistry registry) {
if (!registry.containsBeanDefinition(FACTORY_BEAN_NAME)) {
BeanDefinition definition = BeanDefinitionBuilder
.rootBeanDefinition(ConfigurationPropertiesBinder.Factory.class).getBeanDefinition();
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(ConfigurationPropertiesBinder.FACTORY_BEAN_NAME, definition);
}
if (!registry.containsBeanDefinition(BEAN_NAME)) {
BeanDefinition definition = BeanDefinitionBuilder
.rootBeanDefinition(ConfigurationPropertiesBinder.class,
() -> ((BeanFactory) registry)
.getBean(FACTORY_BEAN_NAME, ConfigurationPropertiesBinder.Factory.class).create())
.getBeanDefinition();
.rootBeanDefinition(ConfigurationPropertiesBinderFactory.class).getBeanDefinition();
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(ConfigurationPropertiesBinder.BEAN_NAME, definition);
}
Expand All @@ -210,27 +200,6 @@ static ConfigurationPropertiesBinder get(BeanFactory beanFactory) {
return beanFactory.getBean(BEAN_NAME, ConfigurationPropertiesBinder.class);
}

/**
* Factory bean used to create the {@link ConfigurationPropertiesBinder}. The bean
* needs to be {@link ApplicationContextAware} since we can't directly inject an
* {@link ApplicationContext} into the constructor without causing eager
* {@link FactoryBean} initialization.
*/
static class Factory implements ApplicationContextAware {

private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

ConfigurationPropertiesBinder create() {
return new ConfigurationPropertiesBinder(this.applicationContext);
}

}

/**
* {@link BindHandler} to deal with
* {@link ConfigurationProperties @ConfigurationProperties} concerns.
Expand All @@ -253,4 +222,27 @@ private boolean isConfigurationProperties(Class<?> target) {

}

static class ConfigurationPropertiesBinderFactory
implements FactoryBean<ConfigurationPropertiesBinder>, ApplicationContextAware {

private ApplicationContext applicationContext;

@Override
public ConfigurationPropertiesBinder getObject() throws Exception {
Assert.notNull(this.applicationContext, "applicationContext must not be null");
return new ConfigurationPropertiesBinder(this.applicationContext);
}

@Override
public Class<?> getObjectType() {
return ConfigurationPropertiesBinder.class;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

}

}

0 comments on commit f0b04d6

Please sign in to comment.