From 1f5eaf20b0353dece9df2d81b309ea6fe1e72d14 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 4 May 2017 11:26:21 +0200 Subject: [PATCH] Basic test for functional bean registration within a configuration class Issue: SPR-13779 --- .../ConfigurationClassProcessingTests.java | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationClassProcessingTests.java b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationClassProcessingTests.java index e34684e7eeb..aa3ee7e286e 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationClassProcessingTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/configuration/ConfigurationClassProcessingTests.java @@ -58,6 +58,7 @@ import org.springframework.context.annotation.Scope; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.support.GenericApplicationContext; import org.springframework.tests.sample.beans.ITestBean; +import org.springframework.tests.sample.beans.NestedTestBean; import org.springframework.tests.sample.beans.TestBean; import static org.junit.Assert.*; @@ -206,40 +207,50 @@ public class ConfigurationClassProcessingTests { @Test public void configurationWithAdaptivePrototypes() { - AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(); - factory.register(ConfigWithPrototypeBean.class, AdaptiveInjectionPoints.class); - factory.refresh(); + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + ctx.register(ConfigWithPrototypeBean.class, AdaptiveInjectionPoints.class); + ctx.refresh(); - AdaptiveInjectionPoints adaptive = factory.getBean(AdaptiveInjectionPoints.class); + AdaptiveInjectionPoints adaptive = ctx.getBean(AdaptiveInjectionPoints.class); assertEquals("adaptiveInjectionPoint1", adaptive.adaptiveInjectionPoint1.getName()); assertEquals("setAdaptiveInjectionPoint2", adaptive.adaptiveInjectionPoint2.getName()); - adaptive = factory.getBean(AdaptiveInjectionPoints.class); + adaptive = ctx.getBean(AdaptiveInjectionPoints.class); assertEquals("adaptiveInjectionPoint1", adaptive.adaptiveInjectionPoint1.getName()); assertEquals("setAdaptiveInjectionPoint2", adaptive.adaptiveInjectionPoint2.getName()); - factory.close(); + ctx.close(); } @Test public void configurationWithPostProcessor() { - AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(); - factory.register(ConfigWithPostProcessor.class); + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + ctx.register(ConfigWithPostProcessor.class); RootBeanDefinition placeholderConfigurer = new RootBeanDefinition(PropertyPlaceholderConfigurer.class); placeholderConfigurer.getPropertyValues().add("properties", "myProp=myValue"); - factory.registerBeanDefinition("placeholderConfigurer", placeholderConfigurer); - factory.refresh(); + ctx.registerBeanDefinition("placeholderConfigurer", placeholderConfigurer); + ctx.refresh(); - TestBean foo = factory.getBean("foo", TestBean.class); - ITestBean bar = factory.getBean("bar", ITestBean.class); - ITestBean baz = factory.getBean("baz", ITestBean.class); + TestBean foo = ctx.getBean("foo", TestBean.class); + ITestBean bar = ctx.getBean("bar", ITestBean.class); + ITestBean baz = ctx.getBean("baz", ITestBean.class); assertEquals("foo-processed-myValue", foo.getName()); assertEquals("bar-processed-myValue", bar.getName()); assertEquals("baz-processed-myValue", baz.getName()); - SpousyTestBean listener = factory.getBean("listenerTestBean", SpousyTestBean.class); + SpousyTestBean listener = ctx.getBean("listenerTestBean", SpousyTestBean.class); assertTrue(listener.refreshed); - factory.close(); + ctx.close(); + } + + @Test + public void configurationWithFunctionalRegistration() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + ctx.register(ConfigWithFunctionalRegistration.class); + ctx.refresh(); + + assertSame(ctx.getBean("spouse"), ctx.getBean(TestBean.class).getSpouse()); + assertEquals("functional", ctx.getBean(NestedTestBean.class).getCompany()); } @@ -419,7 +430,6 @@ public class ConfigurationClassProcessingTests { } - @SuppressWarnings("unused") static class ConfigWithPostProcessor extends ConfigWithPrototypeBean { @Value("${myProp}") @@ -496,4 +506,23 @@ public class ConfigurationClassProcessingTests { } } + + @Configuration + static class ConfigWithFunctionalRegistration { + + @Autowired + void register(GenericApplicationContext ctx) { + ctx.registerBean("spouse", TestBean.class, + () -> new TestBean("functional")); + ctx.registerBean(TestBean.class, + () -> new TestBean(ctx.getBean("spouse", TestBean.class)), + bd -> bd.setPrimary(true)); + } + + @Bean + public NestedTestBean nestedTestBean(TestBean testBean) { + return new NestedTestBean(testBean.getSpouse().getName()); + } + } + }