Infer resource hints for PropertySource#value

This commit adds a resource hints for the target(s) of a @PropertySource
declaration.

Closes gh-30376
This commit is contained in:
Stephane Nicoll
2023-04-26 14:13:19 +02:00
parent f6875b11ff
commit 02132bd060
2 changed files with 44 additions and 7 deletions

View File

@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
import javax.lang.model.element.Modifier;
@@ -31,6 +32,7 @@ import org.springframework.aot.generate.MethodReference;
import org.springframework.aot.generate.MethodReference.ArgumentCodeGenerator;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.ResourcePatternHint;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
import org.springframework.aot.test.generate.TestGenerationContext;
import org.springframework.beans.BeansException;
@@ -249,6 +251,8 @@ class ConfigurationClassPostProcessorAotContributionTests {
BeanFactoryInitializationAotContribution contribution = getContribution(
PropertySourceConfiguration.class);
contribution.applyTo(generationContext, beanFactoryInitializationCode);
assertThat(resource("org/springframework/context/annotation/p1.properties"))
.accepts(generationContext.getRuntimeHints());
compile((initializer, compiled) -> {
GenericApplicationContext freshContext = new GenericApplicationContext();
ConfigurableEnvironment environment = freshContext.getEnvironment();
@@ -265,6 +269,9 @@ class ConfigurationClassPostProcessorAotContributionTests {
BeanFactoryInitializationAotContribution contribution = getContribution(
PropertySourceConfiguration.class, PropertySourceDependentConfiguration.class);
contribution.applyTo(generationContext, beanFactoryInitializationCode);
assertThat(resource("org/springframework/context/annotation/p1.properties")
.and(resource("org/springframework/context/annotation/p2.properties")))
.accepts(generationContext.getRuntimeHints());
compile((initializer, compiled) -> {
GenericApplicationContext freshContext = new GenericApplicationContext();
ConfigurableEnvironment environment = freshContext.getEnvironment();
@@ -304,6 +311,10 @@ class ConfigurationClassPostProcessorAotContributionTests {
.accepts(generationContext.getRuntimeHints());
}
private Predicate<RuntimeHints> resource(String location) {
return RuntimeHintsPredicates.resource().forResource(location);
}
@SuppressWarnings("unchecked")
private void compile(BiConsumer<Consumer<GenericApplicationContext>, Compiled> result) {
MethodReference methodReference = beanFactoryInitializationCode.getInitializers().get(0);