Skip to content

Commit 439344f

Browse files
committed
Merge branch '2.4.x'
Closes spring-projectsgh-24996
2 parents b1f27b7 + 1def245 commit 439344f

File tree

6 files changed

+80
-7
lines changed

6 files changed

+80
-7
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataLoader.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,14 +23,16 @@
2323
import org.springframework.boot.BootstrapContext;
2424
import org.springframework.boot.BootstrapRegistry;
2525
import org.springframework.boot.ConfigurableBootstrapContext;
26+
import org.springframework.boot.logging.DeferredLogFactory;
2627

2728
/**
2829
* Strategy class that can be used used to load {@link ConfigData} for a given
2930
* {@link ConfigDataResource}. Implementations should be added as a
3031
* {@code spring.factories} entries. The following constructor parameter types are
3132
* supported:
3233
* <ul>
33-
* <li>{@link Log} - if the resolver needs deferred logging</li>
34+
* <li>{@link Log} or {@link DeferredLogFactory} - if the loader needs deferred
35+
* logging</li>
3436
* <li>{@link ConfigurableBootstrapContext} - A bootstrap context that can be used to
3537
* store objects that may be expensive to create, or need to be shared
3638
* ({@link BootstrapContext} or {@link BootstrapRegistry} may also be used).</li>

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataLoaders.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -68,6 +68,7 @@ class ConfigDataLoaders {
6868
Instantiator<ConfigDataLoader<?>> instantiator = new Instantiator<>(ConfigDataLoader.class,
6969
(availableParameters) -> {
7070
availableParameters.add(Log.class, logFactory::getLog);
71+
availableParameters.add(DeferredLogFactory.class, logFactory);
7172
availableParameters.add(ConfigurableBootstrapContext.class, bootstrapContext);
7273
availableParameters.add(BootstrapContext.class, bootstrapContext);
7374
availableParameters.add(BootstrapRegistry.class, bootstrapContext);

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataLocationResolver.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
2525
import org.springframework.boot.BootstrapRegistry;
2626
import org.springframework.boot.ConfigurableBootstrapContext;
2727
import org.springframework.boot.context.properties.bind.Binder;
28+
import org.springframework.boot.logging.DeferredLogFactory;
2829
import org.springframework.core.Ordered;
2930
import org.springframework.core.annotation.Order;
3031
import org.springframework.core.env.Environment;
@@ -36,7 +37,8 @@
3637
* {@code spring.factories} entries. The following constructor parameter types are
3738
* supported:
3839
* <ul>
39-
* <li>{@link Log} - if the resolver needs deferred logging</li>
40+
* <li>{@link Log} or {@link DeferredLogFactory} - if the resolver needs deferred
41+
* logging</li>
4042
* <li>{@link Binder} - if the resolver needs to obtain values from the initial
4143
* {@link Environment}</li>
4244
* <li>{@link ResourceLoader} - if the resolver needs a resource loader</li>

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataLocationResolvers.java

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class ConfigDataLocationResolvers {
7070
Instantiator<ConfigDataLocationResolver<?>> instantiator = new Instantiator<>(ConfigDataLocationResolver.class,
7171
(availableParameters) -> {
7272
availableParameters.add(Log.class, logFactory::getLog);
73+
availableParameters.add(DeferredLogFactory.class, logFactory);
7374
availableParameters.add(Binder.class, binder);
7475
availableParameters.add(ResourceLoader.class, resourceLoader);
7576
availableParameters.add(ConfigurableBootstrapContext.class, bootstrapContext);

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataLoadersTests.java

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -57,6 +57,20 @@ void createWhenLoaderHasLogParameterInjectsLog() {
5757
Arrays.asList(LoggingConfigDataLoader.class.getName()));
5858
}
5959

60+
@Test
61+
void createWhenLoaderHasDeferredLogFactoryParameterInjectsDeferredLogFactory() {
62+
ConfigDataLoaders loaders = new ConfigDataLoaders(this.logFactory, this.bootstrapContext,
63+
Arrays.asList(DeferredLogFactoryConfigDataLoader.class.getName()));
64+
assertThat(loaders).extracting("loaders").asList()
65+
.satisfies(this::containsValidDeferredLogFactoryConfigDataLoader);
66+
}
67+
68+
private void containsValidDeferredLogFactoryConfigDataLoader(List<?> list) {
69+
assertThat(list).hasSize(1);
70+
DeferredLogFactoryConfigDataLoader loader = (DeferredLogFactoryConfigDataLoader) list.get(0);
71+
assertThat(loader.getLogFactory()).isSameAs(this.logFactory);
72+
}
73+
6074
@Test
6175
void createWhenLoaderHasBootstrapParametersInjectsBootstrapContext() {
6276
new ConfigDataLoaders(this.logFactory, this.bootstrapContext,
@@ -144,6 +158,26 @@ public ConfigData load(ConfigDataLoaderContext context, ConfigDataResource resou
144158

145159
}
146160

161+
static class DeferredLogFactoryConfigDataLoader implements ConfigDataLoader<ConfigDataResource> {
162+
163+
private final DeferredLogFactory logFactory;
164+
165+
DeferredLogFactoryConfigDataLoader(DeferredLogFactory logFactory) {
166+
assertThat(logFactory).isNotNull();
167+
this.logFactory = logFactory;
168+
}
169+
170+
@Override
171+
public ConfigData load(ConfigDataLoaderContext context, ConfigDataResource resource) throws IOException {
172+
throw new AssertionError("Unexpected call");
173+
}
174+
175+
DeferredLogFactory getLogFactory() {
176+
return this.logFactory;
177+
}
178+
179+
}
180+
147181
static class BootstrappingConfigDataLoader implements ConfigDataLoader<ConfigDataResource> {
148182

149183
BootstrappingConfigDataLoader(ConfigurableBootstrapContext configurableBootstrapContext,

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataLocationResolversTests.java

+34-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
2323
import java.util.List;
2424
import java.util.function.Supplier;
2525

26+
import org.apache.commons.logging.Log;
2627
import org.junit.jupiter.api.Test;
2728
import org.junit.jupiter.api.extension.ExtendWith;
2829
import org.mockito.Mock;
@@ -68,6 +69,17 @@ class ConfigDataLocationResolversTests {
6869

6970
private ResourceLoader resourceLoader = new DefaultResourceLoader();
7071

72+
@Test
73+
void createWhenInjectingLogAndDeferredLogFactoryCreatesResolver() {
74+
ConfigDataLocationResolvers resolvers = new ConfigDataLocationResolvers(this.logFactory, this.bootstrapContext,
75+
this.binder, this.resourceLoader, Collections.singletonList(TestLogResolver.class.getName()));
76+
assertThat(resolvers.getResolvers()).hasSize(1);
77+
assertThat(resolvers.getResolvers().get(0)).isExactlyInstanceOf(TestLogResolver.class);
78+
TestLogResolver resolver = (TestLogResolver) resolvers.getResolvers().get(0);
79+
assertThat(resolver.getDeferredLogFactory()).isSameAs(this.logFactory);
80+
assertThat(resolver.getLog()).isNotNull();
81+
}
82+
7183
@Test
7284
void createWhenInjectingBinderCreatesResolver() {
7385
ConfigDataLocationResolvers resolvers = new ConfigDataLocationResolvers(this.logFactory, this.bootstrapContext,
@@ -180,6 +192,27 @@ public List<TestConfigDataResource> resolveProfileSpecific(ConfigDataLocationRes
180192

181193
}
182194

195+
static class TestLogResolver extends TestResolver {
196+
197+
private final DeferredLogFactory deferredLogFactory;
198+
199+
private final Log log;
200+
201+
TestLogResolver(DeferredLogFactory deferredLogFactory, Log log) {
202+
this.deferredLogFactory = deferredLogFactory;
203+
this.log = log;
204+
}
205+
206+
DeferredLogFactory getDeferredLogFactory() {
207+
return this.deferredLogFactory;
208+
}
209+
210+
Log getLog() {
211+
return this.log;
212+
}
213+
214+
}
215+
183216
static class TestBoundResolver extends TestResolver {
184217

185218
private final Binder binder;

0 commit comments

Comments
 (0)