From d5c0ef6ca3dabc34a372d7567b31e1b2379a0682 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 12 Feb 2014 16:21:37 -0800 Subject: [PATCH] Add ConfigFileApplicationContextInitializer Reintroduce ConfigFileApplicationContextInitializer for tests that wish to reuse 'application.properties' configuration. Fixes gh-344 --- .../config/ConfigFileApplicationListener.java | 31 +++++++++-- ...nfigFileApplicationContextInitializer.java | 45 ++++++++++++++++ ...ileApplicationContextInitializerTests.java | 51 +++++++++++++++++++ 3 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 spring-boot/src/main/java/org/springframework/boot/test/ConfigFileApplicationContextInitializer.java create mode 100644 spring-boot/src/test/java/org/springframework/boot/test/ConfigFileApplicationContextInitializerTests.java diff --git a/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java index 3371d58308..8261b29546 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java @@ -131,6 +131,20 @@ public class ConfigFileApplicationListener implements private void onApplicationEnvironmentPreparedEvent( ConfigurableEnvironment environment, SpringApplication application) { + addProperySources(environment); + bindToSpringApplication(environment, application); + } + + private void onApplicationPreparedEvent(ApplicationPreparedEvent event) { + addPostProcessors(event.getApplicationContext()); + } + + /** + * Add config file property sources to the specified environment. + * @param environment the environment to add source to + * @see #addPostProcessors(ConfigurableApplicationContext) + */ + protected void addProperySources(ConfigurableEnvironment environment) { RandomValuePropertySource.addToEnvironment(environment); try { PropertySource defaultProperties = environment.getPropertySources() @@ -143,18 +157,25 @@ public class ConfigFileApplicationListener implements catch (IOException ex) { throw new IllegalStateException("Unable to load configuration files", ex); } - bindToSpringApplication(application, environment); } - private void bindToSpringApplication(SpringApplication application, - ConfigurableEnvironment environment) { + /** + * Bind the environment to the {@link SpringApplication}. + * @param environment the environment to bind + * @param application the application to bind to + */ + protected void bindToSpringApplication(ConfigurableEnvironment environment, + SpringApplication application) { RelaxedDataBinder binder = new RelaxedDataBinder(application, "spring.main"); binder.setConversionService(this.conversionService); binder.bind(new PropertySourcesPropertyValues(environment.getPropertySources())); } - private void onApplicationPreparedEvent(ApplicationPreparedEvent event) { - ConfigurableApplicationContext context = event.getApplicationContext(); + /** + * Add appropriate post-processors to post-configure the property-sources. + * @param context the context to configure + */ + protected void addPostProcessors(ConfigurableApplicationContext context) { context.addBeanFactoryPostProcessor(new PropertySourceOrderingPostProcessor( context)); } diff --git a/spring-boot/src/main/java/org/springframework/boot/test/ConfigFileApplicationContextInitializer.java b/spring-boot/src/main/java/org/springframework/boot/test/ConfigFileApplicationContextInitializer.java new file mode 100644 index 0000000000..5ec8e6bec8 --- /dev/null +++ b/spring-boot/src/main/java/org/springframework/boot/test/ConfigFileApplicationContextInitializer.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test; + +import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.test.context.ContextConfiguration; + +/** + * {@link ApplicationContextInitializer} that can be used with the + * {@link ContextConfiguration#initializers()} to trigger loading of + * {@literal application.properties}. + * + * @author Phillip Webb + * @see ConfigFileApplicationListener + */ +public class ConfigFileApplicationContextInitializer implements + ApplicationContextInitializer { + + @Override + public void initialize(final ConfigurableApplicationContext applicationContext) { + new ConfigFileApplicationListener() { + public void apply() { + addProperySources(applicationContext.getEnvironment()); + addPostProcessors(applicationContext); + } + }.apply(); + } + +} diff --git a/spring-boot/src/test/java/org/springframework/boot/test/ConfigFileApplicationContextInitializerTests.java b/spring-boot/src/test/java/org/springframework/boot/test/ConfigFileApplicationContextInitializerTests.java new file mode 100644 index 0000000000..7b39c71148 --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/test/ConfigFileApplicationContextInitializerTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Tests for {@link ConfigFileApplicationContextInitializer}. + * + * @author Phillip Webb + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ConfigFileApplicationContextInitializerTests.Config.class, initializers = ConfigFileApplicationContextInitializer.class) +public class ConfigFileApplicationContextInitializerTests { + + @Autowired + private Environment environment; + + @Test + public void test() { + assertThat(this.environment.getProperty("foo"), equalTo("bucket")); + } + + @Configuration + public static class Config { + + } +}