Rework breaking API changes

This commit changes the new mode-based configuration to use two new
methods – setBannerMode on SpringApplication and bannerMode on
SpringApplicationBuilder. The old methods, setShowBanner and
showBanner on SpringApplication and SpringApplicationBuilder
respectively, have been reinstated and deprecated.

Closes gh-4001
This commit is contained in:
Andy Wilkinson 2015-10-08 10:44:16 +01:00
parent 3090659971
commit 01eb4cf954
8 changed files with 88 additions and 49 deletions

View File

@ -43,6 +43,7 @@ content into your application; rather pick only the properties that you need.
spring.main.sources= # sources (class name, package name or XML resource location) to include
spring.main.web-environment= # detect by default
spring.main.show-banner=true
spring.main.banner-mode=console # the mode used to display the banner (console, off, or log)
spring.main....= # see class for all properties
# AUTO-CONFIGURATION

View File

@ -123,7 +123,7 @@ might have.
[source,properties,indent=0,subs="verbatim,quotes,attributes"]
----
spring.main.web_environment=false
spring.main.show_banner=OFF
spring.main.banner_mode=off
----
and then the Spring Boot banner will not be printed on startup, and the application will
@ -139,7 +139,7 @@ consider this application
[source,java,indent=0]
----
new SpringApplicationBuilder()
.showBanner(Banner.Mode.OFF)
.bannerMode(Banner.Mode.OFF)
.sources(demo.MyApp.class)
.run(args);
----
@ -149,7 +149,7 @@ used with the following configuration:
[source,properties,indent=0,subs="verbatim,quotes,attributes"]
----
spring.main.sources=com.acme.Config,com.acme.ExtraConfig
spring.main.show-banner=CONSOLE
spring.main.banner_mode=console
----
The actual application will _now_ show the banner (as overridden by configuration) and use

View File

@ -93,7 +93,7 @@ instance and customize it. For example, to turn off the banner you would write:
----
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setShowBanner(false);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
----
@ -124,7 +124,7 @@ For example:
[source,java,indent=0]
----
new SpringApplicationBuilder()
.showBanner(Banner.Mode.OFF)
.bannerMode(Banner.Mode.OFF)
.sources(Parent.class)
.child(Application.class)
.run(args);

View File

@ -18,6 +18,7 @@ package org.springframework.boot;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Constructor;
import java.security.AccessControlException;
import java.util.ArrayList;
@ -182,7 +183,7 @@ public class SpringApplication {
private Class<?> mainApplicationClass;
private Banner.Mode showBanner = Banner.Mode.CONSOLE;
private Banner.Mode bannerMode = Banner.Mode.CONSOLE;
private boolean logStartupInfo = true;
@ -324,7 +325,7 @@ public class SpringApplication {
environment = convertToStandardEnvironment(environment);
}
if (this.showBanner != Banner.Mode.OFF) {
if (this.bannerMode != Banner.Mode.OFF) {
printBanner(environment);
}
@ -524,21 +525,23 @@ public class SpringApplication {
* banner.location=classpath:banner.txt, banner.charset=UTF-8. If the banner file does
* not exist or cannot be printed, a simple default is created.
* @param environment the environment
* @see #setShowBanner(org.springframework.boot.Banner.Mode)
* @see #setBannerMode
*/
protected void printBanner(Environment environment) {
Banner selectedBanner = selectBanner(environment);
if (this.showBanner == Banner.Mode.LOG) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
selectedBanner.printBanner(environment, this.mainApplicationClass,
new PrintStream(baos));
this.log.info(baos.toString());
if (this.bannerMode == Banner.Mode.LOG) {
try {
this.log.info(createStringFromBanner(selectedBanner, environment));
}
catch (UnsupportedEncodingException ex) {
this.log.warn("Failed to create String for banner", ex);
}
}
else {
selectedBanner
.printBanner(environment, this.mainApplicationClass, System.out);
selectedBanner.printBanner(environment, this.mainApplicationClass,
System.out);
}
}
@ -557,6 +560,14 @@ public class SpringApplication {
return DEFAULT_BANNER;
}
private String createStringFromBanner(Banner banner, Environment environment)
throws UnsupportedEncodingException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
banner.printBanner(environment, this.mainApplicationClass, new PrintStream(baos));
String charset = environment.getProperty("banner.charset", "UTF-8");
return baos.toString(charset);
}
/**
* Strategy method used to create the {@link ApplicationContext}. By default this
* method will respect any explicitly set application context or application context
@ -853,11 +864,22 @@ public class SpringApplication {
/**
* Sets if the Spring banner should be displayed when the application runs. Defaults
* to {@code org.springframework.boot.Banner.Mode.CONSOLE}.
* @param bannerMode if the banner should be shown in log or console, or turned off.
* to {@code true}.
* @param showBanner if the banner should be shown
* @deprecated since 1.3.0 in favor of {@link #setBannerMode}
*/
public void setShowBanner(Banner.Mode bannerMode) {
this.showBanner = bannerMode;
@Deprecated
public void setShowBanner(boolean showBanner) {
setBannerMode(showBanner ? Banner.Mode.CONSOLE : Banner.Mode.OFF);
}
/**
* Sets the mode used to display the banner when the application runs. Defaults to
* {@code Banner.Mode.CONSOLE}.
* @param bannerMode the mode used to display the banner
*/
public void setBannerMode(Banner.Mode bannerMode) {
this.bannerMode = bannerMode;
}
/**

View File

@ -172,7 +172,7 @@ public class SpringApplicationBuilder {
web(false);
// Probably not interested in multiple banners
showBanner(Banner.Mode.OFF);
bannerMode(Banner.Mode.OFF);
// Make sure sources get copied over
this.application.setSources(this.sources);
@ -310,12 +310,19 @@ public class SpringApplicationBuilder {
* Flag to indicate the startup banner should be printed.
* @param showBanner the flag to set. Default true.
* @return the current builder
* @deprecated Since 1.3.0 in favor of {@link #bannerMode}
*/
public SpringApplicationBuilder showBanner(Banner.Mode showBanner) {
@Deprecated
public SpringApplicationBuilder showBanner(boolean showBanner) {
this.application.setShowBanner(showBanner);
return this;
}
public SpringApplicationBuilder bannerMode(Banner.Mode bannerMode) {
this.application.setBannerMode(bannerMode);
return this;
}
/**
* Sets if the application is headless and should not instantiate AWT. Defaults to
* {@code true} to prevent java icons appearing.

View File

@ -163,19 +163,37 @@ public class SpringApplicationTests {
}
@Test
public void disableBanner() throws Exception {
public void disableBannerWithMode() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
application.setShowBanner(Banner.Mode.OFF);
application.setBannerMode(Banner.Mode.OFF);
this.context = application.run();
verify(application, never()).printBanner((Environment) anyObject());
}
@SuppressWarnings("deprecation")
@Test
public void disableBannerWithBoolean() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
application.setShowBanner(false);
this.context = application.run();
verify(application, never()).printBanner((Environment) anyObject());
}
@Test
public void disableBannerViaProperty() throws Exception {
public void disableBannerViaShowBannerProperty() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
this.context = application.run("--spring.main.show_banner=OFF");
this.context = application.run("--spring.main.show_banner=false");
verify(application, never()).printBanner((Environment) anyObject());
}
@Test
public void disableBannerViaBannerModeProperty() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
this.context = application.run("--spring.main.banner-mode=off");
verify(application, never()).printBanner((Environment) anyObject());
}
@ -219,17 +237,8 @@ public class SpringApplicationTests {
public void enableBannerInLogViaProperty() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
this.context = application.run("--spring.main.show_banner=LOG");
verify(application, atLeastOnce()).setShowBanner(Banner.Mode.LOG);
}
@Test
public void verifyBannerOutputContainsLogInfo() throws Exception {
SpringApplication application = spy(new SpringApplication(ExampleConfig.class));
application.setWebEnvironment(false);
application.run("--spring.main.show_banner=LOG",
"--banner.location=classpath:test-banner.txt");
verify(application, atLeastOnce()).setShowBanner(Banner.Mode.LOG);
this.context = application.run("--spring.main.banner-mode=log");
verify(application, atLeastOnce()).setBannerMode(Banner.Mode.LOG);
assertThat(this.output.toString(), containsString("o.s.boot.SpringApplication"));
}
@ -565,8 +574,8 @@ public class SpringApplicationTests {
TestSpringApplication application = new TestSpringApplication(
ExampleConfig.class);
application.setWebEnvironment(false);
this.context = application.run("--spring.main.show_banner=OFF");
assertThat(application.getShowBanner(), is(Banner.Mode.OFF));
this.context = application.run("--spring.main.banner-mode=OFF");
assertThat(application.getBannerMode(), is(Banner.Mode.OFF));
}
@Test
@ -733,7 +742,7 @@ public class SpringApplicationTests {
private boolean useMockLoader;
private Banner.Mode showBanner;
private Banner.Mode bannerMode;
TestSpringApplication(Object... sources) {
super(sources);
@ -764,13 +773,13 @@ public class SpringApplicationTests {
}
@Override
public void setShowBanner(Banner.Mode bannerMode) {
super.setShowBanner(bannerMode);
this.showBanner = bannerMode;
public void setBannerMode(Banner.Mode bannerMode) {
super.setBannerMode(bannerMode);
this.bannerMode = bannerMode;
}
public Banner.Mode getShowBanner() {
return this.showBanner;
public Banner.Mode getBannerMode() {
return this.bannerMode;
}
}

View File

@ -88,7 +88,7 @@ public class ConfigFileEnvironmentPostProcessorTests {
}
System.clearProperty("the.property");
System.clearProperty("spring.config.location");
System.clearProperty("spring.main.showBanner");
System.clearProperty("spring.main.banner-mode");
}
@Test
@ -624,7 +624,7 @@ public class ConfigFileEnvironmentPostProcessorTests {
// gh-346
this.initializer.setSearchNames("bindtoapplication");
this.initializer.postProcessEnvironment(this.environment, this.application);
Field field = ReflectionUtils.findField(SpringApplication.class, "showBanner");
Field field = ReflectionUtils.findField(SpringApplication.class, "bannerMode");
field.setAccessible(true);
assertThat((Banner.Mode) field.get(this.application), equalTo(Banner.Mode.OFF));
}
@ -632,9 +632,9 @@ public class ConfigFileEnvironmentPostProcessorTests {
@Test
public void bindsSystemPropertyToSpringApplication() throws Exception {
// gh-951
System.setProperty("spring.main.showBanner", "OFF");
System.setProperty("spring.main.banner-mode", "off");
this.initializer.postProcessEnvironment(this.environment, this.application);
Field field = ReflectionUtils.findField(SpringApplication.class, "showBanner");
Field field = ReflectionUtils.findField(SpringApplication.class, "bannerMode");
field.setAccessible(true);
assertThat((Banner.Mode) field.get(this.application), equalTo(Banner.Mode.OFF));
}

View File

@ -1 +1 @@
spring.main.show_banner=OFF
spring.main.banner-mode=off