Register printed banner in ApplicationContext

Update SpringApplication to store the banner that was actually printed
as a bean named `springBootBanner`.

Closes gh-5636
pull/5662/head
Michael J. Simons 9 years ago committed by Phillip Webb
parent e14329c77b
commit aaed87d176

@ -94,6 +94,9 @@ You can also use the `spring.main.banner-mode` property to determine if the bann
to be printed on `System.out` (`console`), using the configured logger (`log`) or not to be printed on `System.out` (`console`), using the configured logger (`log`) or not
at all (`off`). at all (`off`).
The printed banner will be registered as a singleton bean under the name
`springBootBanner`.
[NOTE] [NOTE]
==== ====
YAML maps `off` to `false` so make sure to add quotes if you want to disable the YAML maps `off` to `false` so make sure to add quotes if you want to disable the

@ -139,6 +139,7 @@ import org.springframework.web.context.support.StandardServletEnvironment;
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Jeremy Rickard * @author Jeremy Rickard
* @author Craig Burke * @author Craig Burke
* @author Michael Simons
* @see #run(Object, String[]) * @see #run(Object, String[])
* @see #run(Object[], String[]) * @see #run(Object[], String[])
* @see #SpringApplication(Object...) * @see #SpringApplication(Object...)
@ -200,6 +201,8 @@ public class SpringApplication {
private Banner banner; private Banner banner;
private boolean printedCustomBannerViaDeprecatedMethod;
private ResourceLoader resourceLoader; private ResourceLoader resourceLoader;
private BeanNameGenerator beanNameGenerator; private BeanNameGenerator beanNameGenerator;
@ -304,11 +307,10 @@ public class SpringApplication {
args); args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, ConfigurableEnvironment environment = prepareEnvironment(listeners,
applicationArguments); applicationArguments);
if (this.bannerMode != Banner.Mode.OFF) { Banner printedBanner = printBanner(environment);
printBanner(environment);
}
context = createApplicationContext(); context = createApplicationContext();
prepareContext(context, environment, listeners, applicationArguments); prepareContext(context, environment, listeners, applicationArguments,
printedBanner);
refreshContext(context); refreshContext(context);
afterRefresh(context, applicationArguments); afterRefresh(context, applicationArguments);
listeners.finished(context, null); listeners.finished(context, null);
@ -340,7 +342,7 @@ public class SpringApplication {
private void prepareContext(ConfigurableApplicationContext context, private void prepareContext(ConfigurableApplicationContext context,
ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments) { ApplicationArguments applicationArguments, Banner printedBanner) {
context.setEnvironment(environment); context.setEnvironment(environment);
postProcessApplicationContext(context); postProcessApplicationContext(context);
applyInitializers(context); applyInitializers(context);
@ -353,6 +355,9 @@ public class SpringApplication {
// Add boot specific singleton beans // Add boot specific singleton beans
context.getBeanFactory().registerSingleton("springApplicationArguments", context.getBeanFactory().registerSingleton("springApplicationArguments",
applicationArguments); applicationArguments);
if (printedBanner != null) {
context.getBeanFactory().registerSingleton("springBootBanner", printedBanner);
}
// Load the sources // Load the sources
Set<Object> sources = getSources(); Set<Object> sources = getSources();
@ -530,6 +535,29 @@ public class SpringApplication {
environment.setActiveProfiles(profiles.toArray(new String[profiles.size()])); environment.setActiveProfiles(profiles.toArray(new String[profiles.size()]));
} }
private Banner printBanner(ConfigurableEnvironment environment) {
if (printBannerViaDeprecatedMethod(environment)) {
return null;
}
if (this.bannerMode == Banner.Mode.OFF) {
return null;
}
ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader
: new DefaultResourceLoader(getClassLoader());
SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(
resourceLoader, this.banner);
if (this.bannerMode == Mode.LOG) {
return bannerPrinter.print(environment, this.mainApplicationClass, logger);
}
return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
}
private boolean printBannerViaDeprecatedMethod(Environment environment) {
this.printedCustomBannerViaDeprecatedMethod = true;
printBanner(environment);
return this.printedCustomBannerViaDeprecatedMethod;
}
/** /**
* Print a custom banner message to the console, optionally extracting its location or * Print a custom banner message to the console, optionally extracting its location or
* content from the Environment (banner.location and banner.charset). The defaults are * content from the Environment (banner.location and banner.charset). The defaults are
@ -537,18 +565,11 @@ public class SpringApplication {
* not exist or cannot be printed, a simple default is created. * not exist or cannot be printed, a simple default is created.
* @param environment the environment * @param environment the environment
* @see #setBannerMode * @see #setBannerMode
* @deprecated as of 1.4 in favor of @{@link #setBanner(Banner)}
*/ */
@Deprecated
protected void printBanner(Environment environment) { protected void printBanner(Environment environment) {
ResourceLoader resourceLoader = this.resourceLoader != null ? this.resourceLoader this.printedCustomBannerViaDeprecatedMethod = false;
: new DefaultResourceLoader(getClassLoader());
SpringApplicationBannerPrinter banner = new SpringApplicationBannerPrinter(resourceLoader,
this.banner);
if (this.bannerMode == Mode.LOG) {
banner.print(environment, this.mainApplicationClass, logger);
}
else {
banner.print(environment, this.mainApplicationClass, System.out);
}
} }
/** /**

@ -55,7 +55,7 @@ class SpringApplicationBannerPrinter {
this.fallbackBanner = fallbackBanner; this.fallbackBanner = fallbackBanner;
} }
public void print(Environment environment, Class<?> sourceClass, Log logger) { public Banner print(Environment environment, Class<?> sourceClass, Log logger) {
Banner banner = getBanner(environment, this.fallbackBanner); Banner banner = getBanner(environment, this.fallbackBanner);
try { try {
logger.info(createStringFromBanner(banner, environment, sourceClass)); logger.info(createStringFromBanner(banner, environment, sourceClass));
@ -63,11 +63,13 @@ class SpringApplicationBannerPrinter {
catch (UnsupportedEncodingException ex) { catch (UnsupportedEncodingException ex) {
logger.warn("Failed to create String for banner", ex); logger.warn("Failed to create String for banner", ex);
} }
return banner;
} }
public void print(Environment environment, Class<?> sourceClass, PrintStream out) { public Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
Banner banner = getBanner(environment, this.fallbackBanner); Banner banner = getBanner(environment, this.fallbackBanner);
banner.printBanner(environment, sourceClass, out); banner.printBanner(environment, sourceClass, out);
return banner;
} }
private Banner getBanner(Environment environment, Banner definedBanner) { private Banner getBanner(Environment environment, Banner definedBanner) {

@ -22,6 +22,7 @@ import org.junit.After;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.Banner.Mode;
import org.springframework.boot.testutil.InternalOutputCapture; import org.springframework.boot.testutil.InternalOutputCapture;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -34,6 +35,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* *
* @author Phillip Webb * @author Phillip Webb
* @author Michael Stummvoll * @author Michael Stummvoll
* @author Michael Simons
*/ */
public class BannerTests { public class BannerTests {
@ -74,6 +76,49 @@ public class BannerTests {
assertThat(this.out.toString()).contains("My Banner"); assertThat(this.out.toString()).contains("My Banner");
} }
@Test
public void testBannerInContext() throws Exception {
SpringApplication application = new SpringApplication(Config.class);
application.setWebEnvironment(false);
this.context = application.run();
assertThat(this.context.containsBean("springBootBanner")).isTrue();
}
@Test
public void testCustomBannerInContext() throws Exception {
SpringApplication application = new SpringApplication(Config.class);
application.setWebEnvironment(false);
final DummyBanner dummyBanner = new DummyBanner();
application.setBanner(dummyBanner);
this.context = application.run();
assertThat(this.context.getBean("springBootBanner")).isEqualTo(dummyBanner);
}
@Test
public void testDisableBannerInContext() throws Exception {
SpringApplication application = new SpringApplication(Config.class);
application.setBannerMode(Mode.OFF);
application.setWebEnvironment(false);
this.context = application.run();
assertThat(this.context.containsBean("springBootBanner")).isFalse();
}
@Test
public void testDeprecatePrintBanner() throws Exception {
SpringApplication application = new SpringApplication(Config.class) {
@Override
protected void printBanner(Environment environment) {
System.out.println("I printed a deprecated banner");
};
};
application.setWebEnvironment(false);
this.context = application.run();
assertThat(this.out.toString()).contains("I printed a deprecated banner");
assertThat(this.context.containsBean("springBootBanner")).isFalse();
}
static class DummyBanner implements Banner { static class DummyBanner implements Banner {
@Override @Override

Loading…
Cancel
Save