Skip to content

Commit

Permalink
Prevent early resolution of factory beans
Browse files Browse the repository at this point in the history
This commit updates DatabaseInitializationDependencyConfigurer so that
it does not inject the Environment anymore. Doing so in such a low-level
callback can lead to early resolution of factory beans. Rather, this
commit uses the EnvironmentAware callback that short-circuit dependency
resolution.

Closes gh-29475
  • Loading branch information
snicoll committed Jan 19, 2022
1 parent cdd4795 commit 4eb458f
Showing 1 changed file with 9 additions and 17 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2021 the original author or authors.
* Copyright 2012-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -34,6 +34,7 @@
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.boot.util.Instantiator;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.Ordered;
Expand Down Expand Up @@ -63,36 +64,27 @@
*/
public class DatabaseInitializationDependencyConfigurer implements ImportBeanDefinitionRegistrar {

private final Environment environment;

DatabaseInitializationDependencyConfigurer(Environment environment) {
this.environment = environment;
}

@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
String name = DependsOnDatabaseInitializationPostProcessor.class.getName();
if (!registry.containsBeanDefinition(name)) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(
DependsOnDatabaseInitializationPostProcessor.class,
this::createDependsOnDatabaseInitializationPostProcessor);
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.genericBeanDefinition(DependsOnDatabaseInitializationPostProcessor.class);
registry.registerBeanDefinition(name, builder.getBeanDefinition());
}
}

private DependsOnDatabaseInitializationPostProcessor createDependsOnDatabaseInitializationPostProcessor() {
return new DependsOnDatabaseInitializationPostProcessor(this.environment);
}

/**
* {@link BeanFactoryPostProcessor} used to configure database initialization
* dependency relationships.
*/
static class DependsOnDatabaseInitializationPostProcessor implements BeanFactoryPostProcessor, Ordered {
static class DependsOnDatabaseInitializationPostProcessor
implements BeanFactoryPostProcessor, EnvironmentAware, Ordered {

private final Environment environment;
private Environment environment;

DependsOnDatabaseInitializationPostProcessor(Environment environment) {
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}

Expand Down

0 comments on commit 4eb458f

Please sign in to comment.