mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Update OnBeanCondition to consider hierarchy for PARENTS search strategy
Closes gh-6762
This commit is contained in:
parent
c8632f12f6
commit
63b8e82c10
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
* Copyright 2012-2016 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.
|
||||
@ -135,7 +135,7 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<String> beanNames = new ArrayList<String>();
|
||||
boolean considerHierarchy = beans.getStrategy() == SearchStrategy.ALL;
|
||||
boolean considerHierarchy = beans.getStrategy() != SearchStrategy.CURRENT;
|
||||
for (String type : beans.getTypes()) {
|
||||
beanNames.addAll(getBeanNamesForType(beanFactory, type,
|
||||
context.getClassLoader(), considerHierarchy));
|
||||
|
@ -250,6 +250,45 @@ public class ConditionalOnMissingBeanTests {
|
||||
is(equalTo(1)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void grandparentIsConsideredWhenUsingParentsStrategy() {
|
||||
this.context.register(ExampleBeanConfiguration.class);
|
||||
this.context.refresh();
|
||||
AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext();
|
||||
parent.setParent(this.context);
|
||||
parent.refresh();
|
||||
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
|
||||
child.setParent(parent);
|
||||
child.register(ExampleBeanConfiguration.class,
|
||||
OnBeanInParentsConfiguration.class);
|
||||
child.refresh();
|
||||
assertThat(child.getBeansOfType(ExampleBean.class).size(), is(equalTo(1)));
|
||||
child.close();
|
||||
parent.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void currentContextIsIgnoredWhenUsingParentsStrategy() {
|
||||
this.context.refresh();
|
||||
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
|
||||
child.register(ExampleBeanConfiguration.class,
|
||||
OnBeanInParentsConfiguration.class);
|
||||
child.setParent(this.context);
|
||||
child.refresh();
|
||||
assertThat(child.getBeansOfType(ExampleBean.class).size(), is(equalTo(2)));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
protected static class OnBeanInParentsConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(search = SearchStrategy.PARENTS)
|
||||
public ExampleBean exampleBean2() {
|
||||
return new ExampleBean("test");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnMissingBean(name = "foo")
|
||||
protected static class OnBeanNameConfiguration {
|
||||
|
@ -64,6 +64,46 @@ public class ConditionalOnSingleCandidateTests {
|
||||
assertEquals("foo", this.context.getBean("baz"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleCandidateInParentsOneCandidateInCurrent() {
|
||||
load();
|
||||
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
|
||||
child.register(FooConfiguration.class,
|
||||
OnBeanSingleCandidateInParentsConfiguration.class);
|
||||
child.setParent(this.context);
|
||||
child.refresh();
|
||||
assertFalse(child.containsBean("baz"));
|
||||
child.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleCandidateInParentsOneCandidateInParent() {
|
||||
load(FooConfiguration.class);
|
||||
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
|
||||
child.register(OnBeanSingleCandidateInParentsConfiguration.class);
|
||||
child.setParent(this.context);
|
||||
child.refresh();
|
||||
assertTrue(child.containsBean("baz"));
|
||||
assertEquals("foo", child.getBean("baz"));
|
||||
child.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleCandidateInParentsOneCandidateInGrandparent() {
|
||||
load(FooConfiguration.class);
|
||||
AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext();
|
||||
parent.setParent(this.context);
|
||||
parent.refresh();
|
||||
AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext();
|
||||
child.register(OnBeanSingleCandidateInParentsConfiguration.class);
|
||||
child.setParent(parent);
|
||||
child.refresh();
|
||||
assertTrue(child.containsBean("baz"));
|
||||
assertEquals("foo", child.getBean("baz"));
|
||||
child.close();
|
||||
parent.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleCandidateMultipleCandidates() {
|
||||
load(FooConfiguration.class, BarConfiguration.class,
|
||||
@ -121,7 +161,9 @@ public class ConditionalOnSingleCandidateTests {
|
||||
}
|
||||
|
||||
private void load(Class<?>... classes) {
|
||||
if (classes.length > 0) {
|
||||
this.context.register(classes);
|
||||
}
|
||||
this.context.refresh();
|
||||
}
|
||||
|
||||
@ -136,6 +178,17 @@ public class ConditionalOnSingleCandidateTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnSingleCandidate(value = String.class, search = SearchStrategy.PARENTS)
|
||||
protected static class OnBeanSingleCandidateInParentsConfiguration {
|
||||
|
||||
@Bean
|
||||
public String baz(String s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnSingleCandidate(value = String.class, type = "java.lang.String")
|
||||
protected static class OnBeanSingleCandidateTwoTypesConfiguration {
|
||||
|
Loading…
Reference in New Issue
Block a user