|
28 | 28 | import org.junit.jupiter.api.Test;
|
29 | 29 |
|
30 | 30 | import org.springframework.beans.factory.FactoryBean;
|
| 31 | +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
31 | 32 | import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
32 | 33 | import org.springframework.beans.factory.support.RootBeanDefinition;
|
33 | 34 | import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport.ConditionAndOutcomes;
|
34 | 35 | import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
|
35 | 36 | import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
| 37 | +import org.springframework.context.ApplicationContext; |
36 | 38 | import org.springframework.context.ConfigurableApplicationContext;
|
37 | 39 | import org.springframework.context.annotation.Bean;
|
38 | 40 | import org.springframework.context.annotation.Configuration;
|
@@ -131,6 +133,19 @@ void beanProducedByFactoryBeanIsConsideredWhenMatchingOnAnnotation() {
|
131 | 133 | });
|
132 | 134 | }
|
133 | 135 |
|
| 136 | + @Test |
| 137 | + void beanProducedByFactoryBeanIsConsideredWhenMatchingOnAnnotation2() { |
| 138 | + this.contextRunner |
| 139 | + .withUserConfiguration(EarlyInitializationFactoryBeanConfiguration.class, |
| 140 | + EarlyInitializationOnAnnotationFactoryBeanConfiguration.class) |
| 141 | + .run((context) -> { |
| 142 | + assertThat(EarlyInitializationFactoryBeanConfiguration.calledWhenNoFrozen).as("calledWhenNoFrozen") |
| 143 | + .isFalse(); |
| 144 | + assertThat(context).hasBean("bar"); |
| 145 | + assertThat(context).hasSingleBean(ExampleBean.class); |
| 146 | + }); |
| 147 | + } |
| 148 | + |
134 | 149 | private void hasBarBean(AssertableApplicationContext context) {
|
135 | 150 | assertThat(context).hasBean("bar");
|
136 | 151 | assertThat(context.getBean("bar")).isEqualTo("bar");
|
@@ -352,6 +367,35 @@ String bar() {
|
352 | 367 |
|
353 | 368 | }
|
354 | 369 |
|
| 370 | + @Configuration(proxyBeanMethods = false) |
| 371 | + static class EarlyInitializationFactoryBeanConfiguration { |
| 372 | + |
| 373 | + static boolean calledWhenNoFrozen; |
| 374 | + |
| 375 | + @Bean |
| 376 | + @TestAnnotation |
| 377 | + static FactoryBean<?> exampleBeanFactoryBean(ApplicationContext applicationContext) { |
| 378 | + // NOTE: must be static and return raw FactoryBean and not the subclass so |
| 379 | + // Spring can't guess type |
| 380 | + ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext) |
| 381 | + .getBeanFactory(); |
| 382 | + calledWhenNoFrozen = calledWhenNoFrozen || !beanFactory.isConfigurationFrozen(); |
| 383 | + return new ExampleFactoryBean(); |
| 384 | + } |
| 385 | + |
| 386 | + } |
| 387 | + |
| 388 | + @Configuration(proxyBeanMethods = false) |
| 389 | + @ConditionalOnBean(annotation = TestAnnotation.class) |
| 390 | + static class EarlyInitializationOnAnnotationFactoryBeanConfiguration { |
| 391 | + |
| 392 | + @Bean |
| 393 | + String bar() { |
| 394 | + return "bar"; |
| 395 | + } |
| 396 | + |
| 397 | + } |
| 398 | + |
355 | 399 | static class WithPropertyPlaceholderClassNameRegistrar implements ImportBeanDefinitionRegistrar {
|
356 | 400 |
|
357 | 401 | @Override
|
@@ -518,7 +562,7 @@ static class OtherExampleBean extends ExampleBean {
|
518 | 562 |
|
519 | 563 | }
|
520 | 564 |
|
521 |
| - @Target(ElementType.TYPE) |
| 565 | + @Target({ ElementType.TYPE, ElementType.METHOD }) |
522 | 566 | @Retention(RetentionPolicy.RUNTIME)
|
523 | 567 | @Documented
|
524 | 568 | @interface TestAnnotation {
|
|
0 commit comments