Browse Source

Reintroduce previous EnvironmentPostProcessor in deprecated form

Restore previous `EnvironmentPostProcessor` in deprecated form to help
lessen upgrade pain.

Closes gh-47272
pull/47314/head
Phillip Webb 3 months ago
parent
commit
3a9ab15696
  1. 7
      buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java
  2. 65
      core/spring-boot/src/main/java/org/springframework/boot/env/EnvironmentPostProcessor.java
  3. 34
      core/spring-boot/src/main/java/org/springframework/boot/support/SpringFactoriesEnvironmentPostProcessorsFactory.java

7
buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java

@ -130,7 +130,12 @@ final class ArchitectureRules { @@ -130,7 +130,12 @@ final class ArchitectureRules {
}
private static ArchRule allPackagesShouldBeFreeOfTangles() {
return SlicesRuleDefinition.slices().matching("(**)").should().beFreeOfCycles();
return SlicesRuleDefinition.slices()
.matching("(**)")
.should()
.beFreeOfCycles()
.ignoreDependency("org.springframework.boot.env.EnvironmentPostProcessor",
"org.springframework.boot.SpringApplication");
}
private static ArchRule allBeanPostProcessorBeanMethodsShouldBeStaticAndNotCausePrematureInitialization() {

65
core/spring-boot/src/main/java/org/springframework/boot/env/EnvironmentPostProcessor.java vendored

@ -0,0 +1,65 @@ @@ -0,0 +1,65 @@
/*
* Copyright 2012-present 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.env;
import org.springframework.boot.bootstrap.BootstrapContext;
import org.springframework.boot.bootstrap.BootstrapRegistry;
import org.springframework.boot.bootstrap.ConfigurableBootstrapContext;
import org.springframework.boot.logging.DeferredLogFactory;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
/**
* Allows for customization of the application's {@link Environment} prior to the
* application context being refreshed.
* <p>
* EnvironmentPostProcessor implementations have to be registered in
* {@code META-INF/spring.factories}, using the fully qualified name of this class as the
* key. Implementations may implement the {@link org.springframework.core.Ordered Ordered}
* interface or use an {@link org.springframework.core.annotation.Order @Order} annotation
* if they wish to be invoked in specific order.
* <p>
* Since Spring Boot 2.4, {@code EnvironmentPostProcessor} implementations may optionally
* take the following constructor parameters:
* <ul>
* <li>{@link DeferredLogFactory} - A factory that can be used to create loggers with
* output deferred until the application has been fully prepared (allowing the environment
* itself to configure logging levels).</li>
* <li>{@link ConfigurableBootstrapContext} - A bootstrap context that can be used to
* store objects that may be expensive to create, or need to be shared
* ({@link BootstrapContext} or {@link BootstrapRegistry} may also be used).</li>
* </ul>
*
* @author Andy Wilkinson
* @author Stephane Nicoll
* @since 1.3.0
* @deprecated since 4.0.0 for removal in 4.2.0 in favor of
* {@link org.springframework.boot.EnvironmentPostProcessor}
*/
@FunctionalInterface
@Deprecated(since = "4.0.0", forRemoval = true)
public interface EnvironmentPostProcessor {
/**
* Post-process the given {@code environment}.
* @param environment the environment to post-process
* @param application the application to which the environment belongs
*/
void postProcessEnvironment(ConfigurableEnvironment environment,
org.springframework.boot.SpringApplication application);
}

34
core/spring-boot/src/main/java/org/springframework/boot/support/SpringFactoriesEnvironmentPostProcessorsFactory.java

@ -16,13 +16,18 @@ @@ -16,13 +16,18 @@
package org.springframework.boot.support;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.boot.EnvironmentPostProcessor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.bootstrap.BootstrapContext;
import org.springframework.boot.bootstrap.BootstrapRegistry;
import org.springframework.boot.bootstrap.ConfigurableBootstrapContext;
import org.springframework.boot.logging.DeferredLogFactory;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.io.support.SpringFactoriesLoader.ArgumentResolver;
@ -46,7 +51,34 @@ class SpringFactoriesEnvironmentPostProcessorsFactory implements EnvironmentPost @@ -46,7 +51,34 @@ class SpringFactoriesEnvironmentPostProcessorsFactory implements EnvironmentPost
argumentResolver = argumentResolver.and(ConfigurableBootstrapContext.class, bootstrapContext);
argumentResolver = argumentResolver.and(BootstrapContext.class, bootstrapContext);
argumentResolver = argumentResolver.and(BootstrapRegistry.class, bootstrapContext);
return this.loader.load(EnvironmentPostProcessor.class, argumentResolver);
List<Object> postProcessors = new ArrayList<>();
postProcessors.addAll(this.loader.load(EnvironmentPostProcessor.class, argumentResolver));
postProcessors.addAll(loadDeprecatedPostProcessors());
AnnotationAwareOrderComparator.sort(postProcessors);
return postProcessors.stream().map(Adapter::apply).collect(Collectors.toCollection(ArrayList::new));
}
@SuppressWarnings("removal")
private List<org.springframework.boot.env.EnvironmentPostProcessor> loadDeprecatedPostProcessors() {
return this.loader.load(org.springframework.boot.env.EnvironmentPostProcessor.class);
}
@SuppressWarnings("removal")
record Adapter(
org.springframework.boot.env.EnvironmentPostProcessor postProcessor) implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
this.postProcessor.postProcessEnvironment(environment, application);
}
static EnvironmentPostProcessor apply(Object source) {
if (source instanceof EnvironmentPostProcessor environmentPostProcessor) {
return environmentPostProcessor;
}
return new Adapter((org.springframework.boot.env.EnvironmentPostProcessor) source);
}
}
}

Loading…
Cancel
Save