Pass args to SpringApplicationInitializers

Change SpringApplicationInitializer interface to include run() args.
Allow initializers to make additional configurations based on the user
supplied arguments.

Issue: #55202588
This commit is contained in:
Phillip Webb 2013-08-14 14:45:03 -07:00 committed by Phillip Webb
parent 76bda7e3b4
commit 87b0cea6f6
5 changed files with 17 additions and 10 deletions

View File

@ -211,8 +211,13 @@ public class SpringApplication {
return true; return true;
} }
/**
* Returns {@link ApplicationContextInitializer} loaded via the
* {@link SpringFactoriesLoader}. Subclasses can override this method to modify
* default initializers if necessary.
*/
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({ "rawtypes", "unchecked" })
private Collection<ApplicationContextInitializer<?>> getSpringFactoriesApplicationContextInitializers() { protected Collection<ApplicationContextInitializer<?>> getSpringFactoriesApplicationContextInitializers() {
return (Collection) SpringFactoriesLoader.loadFactories( return (Collection) SpringFactoriesLoader.loadFactories(
ApplicationContextInitializer.class, ApplicationContextInitializer.class,
SpringApplication.class.getClassLoader()); SpringApplication.class.getClassLoader());
@ -241,14 +246,14 @@ public class SpringApplication {
*/ */
public ApplicationContext run(String... args) { public ApplicationContext run(String... args) {
// Call all non environment aware initializers very early // Call all non environment aware initializers very early
callNonEnvironmentAwareSpringApplicationInitializers(); callNonEnvironmentAwareSpringApplicationInitializers(args);
// Create and configure the environment // Create and configure the environment
ConfigurableEnvironment environment = getOrCreateEnvironment(); ConfigurableEnvironment environment = getOrCreateEnvironment();
addPropertySources(environment, args); addPropertySources(environment, args);
// Call all remaining initializers // Call all remaining initializers
callEnvironmentAwareSpringApplicationInitializers(environment); callEnvironmentAwareSpringApplicationInitializers(args, environment);
Set<Object> sources = assembleSources(); Set<Object> sources = assembleSources();
Assert.notEmpty(sources, "Sources must not be empty"); Assert.notEmpty(sources, "Sources must not be empty");
if (this.showBanner) { if (this.showBanner) {
@ -281,11 +286,11 @@ public class SpringApplication {
return sources; return sources;
} }
private void callNonEnvironmentAwareSpringApplicationInitializers() { private void callNonEnvironmentAwareSpringApplicationInitializers(String[] args) {
for (ApplicationContextInitializer<?> initializer : this.initializers) { for (ApplicationContextInitializer<?> initializer : this.initializers) {
if (initializer instanceof SpringApplicationInitializer if (initializer instanceof SpringApplicationInitializer
&& !(initializer instanceof EnvironmentAware)) { && !(initializer instanceof EnvironmentAware)) {
((SpringApplicationInitializer) initializer).initialize(this); ((SpringApplicationInitializer) initializer).initialize(this, args);
} }
} }
} }
@ -322,13 +327,13 @@ public class SpringApplication {
} }
} }
private void callEnvironmentAwareSpringApplicationInitializers( private void callEnvironmentAwareSpringApplicationInitializers(String[] args,
ConfigurableEnvironment environment) { ConfigurableEnvironment environment) {
for (ApplicationContextInitializer<?> initializer : this.initializers) { for (ApplicationContextInitializer<?> initializer : this.initializers) {
if (initializer instanceof SpringApplicationInitializer if (initializer instanceof SpringApplicationInitializer
&& initializer instanceof EnvironmentAware) { && initializer instanceof EnvironmentAware) {
((EnvironmentAware) initializer).setEnvironment(environment); ((EnvironmentAware) initializer).setEnvironment(environment);
((SpringApplicationInitializer) initializer).initialize(this); ((SpringApplicationInitializer) initializer).initialize(this, args);
} }
} }
} }

View File

@ -32,7 +32,8 @@ public interface SpringApplicationInitializer {
/** /**
* Initialize the application * Initialize the application
* @param springApplication the spring application. * @param springApplication the spring application.
* @param args the run arguments
*/ */
void initialize(SpringApplication springApplication); void initialize(SpringApplication springApplication, String[] args);
} }

View File

@ -105,7 +105,7 @@ public class ConfigFileApplicationContextInitializer implements
* ("spring.main.show_banner=false"). * ("spring.main.show_banner=false").
*/ */
@Override @Override
public void initialize(SpringApplication springApplication) { public void initialize(SpringApplication springApplication, String[] args) {
if (this.environment instanceof ConfigurableEnvironment) { if (this.environment instanceof ConfigurableEnvironment) {
ConfigurableEnvironment environment = (ConfigurableEnvironment) this.environment; ConfigurableEnvironment environment = (ConfigurableEnvironment) this.environment;
load(environment, new DefaultResourceLoader()); load(environment, new DefaultResourceLoader());

View File

@ -45,6 +45,7 @@ public class EnvironmentDelegateApplicationContextInitializer implements
// NOTE: Similar to org.springframework.web.context.ContextLoader // NOTE: Similar to org.springframework.web.context.ContextLoader
private static final String PROPERTY_NAME = "context.initializer.classes"; private static final String PROPERTY_NAME = "context.initializer.classes";
private int order = 0; private int order = 0;
@Override @Override

View File

@ -81,7 +81,7 @@ public class LoggingApplicationContextInitializer implements
private int order = Integer.MIN_VALUE + 11; private int order = Integer.MIN_VALUE + 11;
@Override @Override
public void initialize(SpringApplication springApplication) { public void initialize(SpringApplication springApplication, String[] args) {
if (System.getProperty("PID") == null) { if (System.getProperty("PID") == null) {
System.setProperty("PID", getPid()); System.setProperty("PID", getPid());
} }