diff --git a/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java b/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java index 2c07c7c42e3..989e1ca1174 100644 --- a/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java +++ b/spring-boot/src/main/java/org/springframework/boot/BeanDefinitionLoader.java @@ -155,7 +155,8 @@ class BeanDefinitionLoader { private int load(CharSequence source) { try { - return load(Class.forName(source.toString())); + // Use class utils so that period separated nested class names work + return load(ClassUtils.forName(source.toString(), null)); } catch (ClassNotFoundException ex) { // swallow exception and continue diff --git a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java index 5e9d0b3794f..5eb6e97418b 100644 --- a/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java +++ b/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java @@ -161,6 +161,8 @@ public class SpringApplication { private String[] defaultCommandLineArgs; + private boolean sourcesInitialized = false; + /** * Crate a new {@link SpringApplication} instance. The application context will load * beans from the specified sources (see {@link SpringApplication class-level} @@ -190,7 +192,8 @@ public class SpringApplication { } private void initialize(Object[] sources) { - if (sources != null) { + if (sources != null && sources.length > 0) { + this.sourcesInitialized = true; this.sources.addAll(Arrays.asList(sources)); } this.webEnvironment = deduceWebEnvironment(); @@ -576,6 +579,9 @@ public class SpringApplication { * @see #SpringApplication(Object...) */ public void setSources(Set sources) { + if (this.sourcesInitialized) { + return; + } Assert.notNull(sources, "Sources must not be null"); this.sources = new LinkedHashSet(sources); } diff --git a/spring-boot/src/test/java/org/springframework/boot/OverrideSourcesTests.java b/spring-boot/src/test/java/org/springframework/boot/OverrideSourcesTests.java new file mode 100644 index 00000000000..f31b78badd4 --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/OverrideSourcesTests.java @@ -0,0 +1,90 @@ +/* + * Copyright 2012-2013 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; + +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import static org.junit.Assert.assertEquals; + +/** + * @author Dave Syer + */ +public class OverrideSourcesTests { + + @Test + public void beanInjectedToMainConfiguration() { + ApplicationContext context = SpringApplication.run( + new Object[] { MainConfiguration.class }, + new String[] { "--spring.main.web_environment=false" }); + assertEquals("foo", context.getBean(Service.class).bean.name); + } + + @Test + public void primaryBeanInjectedProvingSourcesNotOverridden() { + ApplicationContext context = SpringApplication + .run(new Object[] { MainConfiguration.class, TestConfiguration.class }, + new String[] { "--spring.main.web_environment=false", + "--spring.main.sources=org.springframework.boot.OverrideSourcesTests.MainConfiguration" }); + assertEquals("bar", context.getBean(Service.class).bean.name); + } + + @Configuration + protected static class TestConfiguration { + + @Bean + @Primary + public TestBean another() { + return new TestBean("bar"); + } + + } + + @Configuration + protected static class MainConfiguration { + + @Bean + public TestBean first() { + return new TestBean("foo"); + } + + @Bean + public Service Service() { + return new Service(); + } + + } + + protected static class Service { + @Autowired + private TestBean bean; + } + + protected static class TestBean { + + private String name; + + public TestBean(String name) { + this.name = name; + } + + } +}