Skip to content

Commit 3dacf4b

Browse files
author
Dave Syer
committed
Migrate Logging and Liquibase initializers to be listeners
1 parent 27ae6a5 commit 3dacf4b

File tree

13 files changed

+175
-66
lines changed

13 files changed

+175
-66
lines changed

spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/ManagementSecurityAutoConfigurationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
2424
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
2525
import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration;
26-
import org.springframework.boot.context.initializer.LoggingApplicationContextInitializer;
26+
import org.springframework.boot.context.listener.LoggingApplicationListener;
2727
import org.springframework.context.annotation.Bean;
2828
import org.springframework.context.annotation.Configuration;
2929
import org.springframework.context.event.ContextRefreshedEvent;
@@ -170,7 +170,7 @@ public void testSecurityPropertiesNotAvailable() throws Exception {
170170
private static AnnotationConfigWebApplicationContext debugRefresh(
171171
AnnotationConfigWebApplicationContext context) {
172172
TestUtils.addEnviroment(context, "debug:true");
173-
LoggingApplicationContextInitializer logging = new LoggingApplicationContextInitializer();
173+
LoggingApplicationListener logging = new LoggingApplicationListener();
174174
logging.initialize(context);
175175
AutoConfigurationReportLoggingInitializer initializer = new AutoConfigurationReportLoggingInitializer();
176176
initializer.initialize(context);

spring-boot-actuator/src/test/java/org/springframework/boot/actuate/web/DefaultErrorViewIntegrationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.springframework.boot.SpringApplication;
2424
import org.springframework.boot.actuate.web.DefaultErrorViewIntegrationTests.TestConfiguration;
2525
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
26-
import org.springframework.boot.context.initializer.LoggingApplicationContextInitializer;
26+
import org.springframework.boot.context.listener.LoggingApplicationListener;
2727
import org.springframework.context.annotation.Configuration;
2828
import org.springframework.http.MediaType;
2929
import org.springframework.test.context.ContextConfiguration;
@@ -41,7 +41,7 @@
4141
/**
4242
* @author Dave Syer
4343
*/
44-
@ContextConfiguration(classes = TestConfiguration.class, initializers = { LoggingApplicationContextInitializer.class })
44+
@ContextConfiguration(classes = TestConfiguration.class, initializers = { LoggingApplicationListener.class })
4545
@RunWith(SpringJUnit4ClassRunner.class)
4646
@WebAppConfiguration
4747
public class DefaultErrorViewIntegrationTests {

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
2525
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
2626
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
27-
import org.springframework.boot.context.initializer.LoggingApplicationContextInitializer;
27+
import org.springframework.boot.context.listener.LoggingApplicationListener;
2828
import org.springframework.context.annotation.Bean;
2929
import org.springframework.context.annotation.ComponentScan;
3030
import org.springframework.context.annotation.Configuration;
@@ -117,7 +117,7 @@ public void testJpaCoexistsHappily() throws Exception {
117117
private static AnnotationConfigWebApplicationContext debugRefresh(
118118
AnnotationConfigWebApplicationContext context) {
119119
TestUtils.addEnviroment(context, "debug:true");
120-
LoggingApplicationContextInitializer logging = new LoggingApplicationContextInitializer();
120+
LoggingApplicationListener logging = new LoggingApplicationListener();
121121
logging.initialize(context);
122122
AutoConfigurationReportLoggingInitializer initializer = new AutoConfigurationReportLoggingInitializer();
123123
initializer.initialize(context);

spring-boot/src/main/java/org/springframework/boot/SpringApplication.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,17 +320,19 @@ public ConfigurableApplicationContext run(String... args) {
320320
}
321321

322322
// Notify listeners of the environment creation
323-
multicaster.multicastEvent(new SpringApplicationNewEnvironmentEvent(this,
324-
environment, args));
323+
multicaster.multicastEvent(new SpringApplicationEnvironmentAvailableEvent(
324+
this, environment, args));
325325

326326
// Sources might have changed when environment was applied
327327
sources = getSources();
328-
registerListeners(multicaster, sources);
329328
Assert.notEmpty(sources, "Sources must not be empty");
330329
if (this.showBanner) {
331330
printBanner();
332331
}
333332

333+
// Some sources might be listeners
334+
registerListeners(multicaster, sources);
335+
334336
// Create, load, refresh and run the ApplicationContext
335337
context = createApplicationContext();
336338
registerApplicationEventMulticaster(context, multicaster);
@@ -343,6 +345,9 @@ public ConfigurableApplicationContext run(String... args) {
343345
}
344346

345347
load(context, sources.toArray(new Object[sources.size()]));
348+
// Notify listeners of intention to refresh
349+
multicaster.multicastEvent(new SpringApplicationBeforeRefreshEvent(this,
350+
context, args));
346351
refresh(context);
347352

348353
stopWatch.stop();
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright 2012-2013 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot;
18+
19+
import org.springframework.context.ApplicationContext;
20+
import org.springframework.context.ApplicationEvent;
21+
import org.springframework.context.ConfigurableApplicationContext;
22+
import org.springframework.core.env.Environment;
23+
24+
/**
25+
* Event published as when a {@link SpringApplication} is starting up and the
26+
* {@link ApplicationContext} is about to refresh. The bean definitions will be loaded and
27+
* the {@link Environment} is ready for use at this stage.
28+
*
29+
* @author Dave Syer
30+
*/
31+
public class SpringApplicationBeforeRefreshEvent extends ApplicationEvent {
32+
33+
private String[] args;
34+
private ConfigurableApplicationContext context;
35+
36+
/**
37+
* @param springApplication the current application
38+
* @param context the ApplicationContext about to be refreshed
39+
* @param args the argumemts the application is running with
40+
*/
41+
public SpringApplicationBeforeRefreshEvent(SpringApplication springApplication,
42+
ConfigurableApplicationContext context, String[] args) {
43+
super(springApplication);
44+
this.context = context;
45+
this.args = args;
46+
}
47+
48+
/**
49+
* @return the springApplication
50+
*/
51+
public SpringApplication getSpringApplication() {
52+
return (SpringApplication) getSource();
53+
}
54+
55+
/**
56+
* @return the args
57+
*/
58+
public String[] getArgs() {
59+
return this.args;
60+
}
61+
62+
/**
63+
* @return the context
64+
*/
65+
public ConfigurableApplicationContext getApplicationContext() {
66+
return this.context;
67+
}
68+
69+
}

spring-boot/src/main/java/org/springframework/boot/SpringApplicationNewEnvironmentEvent.java renamed to spring-boot/src/main/java/org/springframework/boot/SpringApplicationEnvironmentAvailableEvent.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@
2121
import org.springframework.core.env.Environment;
2222

2323
/**
24-
* Event published as early when a {@link SpringApplication} is starting up and the
24+
* Event published when a {@link SpringApplication} is starting up and the
2525
* {@link Environment} is first available for inspection and modification.
2626
*
2727
* @author Dave Syer
2828
*/
29-
public class SpringApplicationNewEnvironmentEvent extends ApplicationEvent {
29+
public class SpringApplicationEnvironmentAvailableEvent extends ApplicationEvent {
3030

3131
private ConfigurableEnvironment environment;
3232
private String[] args;
@@ -36,8 +36,9 @@ public class SpringApplicationNewEnvironmentEvent extends ApplicationEvent {
3636
* @param environment the environment that was just created
3737
* @param args the argumemts the application is running with
3838
*/
39-
public SpringApplicationNewEnvironmentEvent(SpringApplication springApplication,
40-
ConfigurableEnvironment environment, String[] args) {
39+
public SpringApplicationEnvironmentAvailableEvent(
40+
SpringApplication springApplication, ConfigurableEnvironment environment,
41+
String[] args) {
4142
super(springApplication);
4243
this.environment = environment;
4344
this.args = args;

spring-boot/src/main/java/org/springframework/boot/context/initializer/ConfigFileApplicationContextInitializer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.springframework.beans.PropertyValues;
3131
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
3232
import org.springframework.boot.SpringApplication;
33-
import org.springframework.boot.SpringApplicationNewEnvironmentEvent;
33+
import org.springframework.boot.SpringApplicationEnvironmentAvailableEvent;
3434
import org.springframework.boot.bind.PropertySourcesPropertyValues;
3535
import org.springframework.boot.bind.RelaxedDataBinder;
3636
import org.springframework.boot.config.PropertiesPropertySourceLoader;
@@ -89,7 +89,7 @@
8989
*/
9090
public class ConfigFileApplicationContextInitializer implements
9191
ApplicationContextInitializer<ConfigurableApplicationContext>,
92-
ApplicationListener<SpringApplicationNewEnvironmentEvent>, Ordered {
92+
ApplicationListener<SpringApplicationEnvironmentAvailableEvent>, Ordered {
9393

9494
private static final String LOCATION_VARIABLE = "${spring.config.location}";
9595

@@ -114,7 +114,7 @@ public class ConfigFileApplicationContextInitializer implements
114114
* ("spring.main.show_banner=false").
115115
*/
116116
@Override
117-
public void onApplicationEvent(SpringApplicationNewEnvironmentEvent event) {
117+
public void onApplicationEvent(SpringApplicationEnvironmentAvailableEvent event) {
118118
Environment created = event.getEnvironment();
119119
if (created instanceof ConfigurableEnvironment) {
120120
SpringApplication springApplication = event.getSpringApplication();
Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,29 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.context.initializer;
17+
package org.springframework.boot.context.listener;
1818

1919
import java.lang.management.ManagementFactory;
20+
import java.util.Arrays;
21+
import java.util.Collection;
2022
import java.util.HashMap;
2123
import java.util.List;
2224
import java.util.Map;
2325

2426
import org.apache.commons.logging.Log;
2527
import org.apache.commons.logging.LogFactory;
28+
import org.springframework.boot.SpringApplication;
29+
import org.springframework.boot.SpringApplicationBeforeRefreshEvent;
30+
import org.springframework.boot.SpringApplicationEnvironmentAvailableEvent;
2631
import org.springframework.boot.SpringApplicationStartEvent;
2732
import org.springframework.boot.logging.LogLevel;
2833
import org.springframework.boot.logging.LoggingSystem;
2934
import org.springframework.context.ApplicationContextInitializer;
30-
import org.springframework.context.ApplicationListener;
31-
import org.springframework.context.ConfigurableApplicationContext;
32-
import org.springframework.core.Ordered;
35+
import org.springframework.context.ApplicationEvent;
36+
import org.springframework.context.event.SmartApplicationListener;
3337
import org.springframework.core.env.ConfigurableEnvironment;
3438
import org.springframework.core.env.Environment;
39+
import org.springframework.util.ClassUtils;
3540
import org.springframework.util.LinkedMultiValueMap;
3641
import org.springframework.util.MultiValueMap;
3742
import org.springframework.util.ResourceUtils;
@@ -50,7 +55,7 @@
5055
* logback; and <code>classpath:logging.properties</code> for
5156
* <code>java.util.logging</code>. If the correct one of those files is not found then
5257
* some sensible defaults are adopted from files of the same name but in the package
53-
* containing {@link LoggingApplicationContextInitializer}.
58+
* containing {@link LoggingApplicationListener}.
5459
* </p>
5560
*
5661
* <p>
@@ -68,9 +73,7 @@
6873
* @author Dave Syer
6974
* @author Phillip Webb
7075
*/
71-
public class LoggingApplicationContextInitializer implements
72-
ApplicationContextInitializer<ConfigurableApplicationContext>,
73-
ApplicationListener<SpringApplicationStartEvent>, Ordered {
76+
public class LoggingApplicationListener implements SmartApplicationListener {
7477

7578
private static final Map<String, String> ENVIRONMENT_SYSTEM_PROPERTY_MAPPING;
7679
static {
@@ -90,6 +93,12 @@ public class LoggingApplicationContextInitializer implements
9093
LOG_LEVEL_LOGGERS.add(LogLevel.TRACE, "org.hibernate.tool.hbm2ddl");
9194
}
9295

96+
@SuppressWarnings("unchecked")
97+
private static Collection<Class<? extends ApplicationEvent>> EVENT_TYPES = Arrays
98+
.<Class<? extends ApplicationEvent>> asList(
99+
SpringApplicationStartEvent.class,
100+
SpringApplicationBeforeRefreshEvent.class);
101+
93102
private final Log logger = LogFactory.getLog(getClass());
94103

95104
private int order = Integer.MIN_VALUE + 11;
@@ -99,23 +108,42 @@ public class LoggingApplicationContextInitializer implements
99108
private LogLevel springBootLogging = null;
100109

101110
@Override
102-
public void onApplicationEvent(SpringApplicationStartEvent event) {
103-
if (System.getProperty("PID") == null) {
104-
System.setProperty("PID", getPid());
111+
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
112+
for (Class<? extends ApplicationEvent> type : EVENT_TYPES) {
113+
if (type.isAssignableFrom(eventType)) {
114+
return true;
115+
}
116+
}
117+
return false;
118+
}
119+
120+
@Override
121+
public boolean supportsSourceType(Class<?> sourceType) {
122+
return SpringApplication.class.isAssignableFrom(sourceType);
123+
}
124+
125+
@Override
126+
public void onApplicationEvent(ApplicationEvent event) {
127+
if (event instanceof SpringApplicationEnvironmentAvailableEvent) {
128+
SpringApplicationEnvironmentAvailableEvent available = (SpringApplicationEnvironmentAvailableEvent) event;
129+
initialize(available.getEnvironment(), available.getSpringApplication()
130+
.getClassLoader());
131+
}
132+
else {
133+
if (System.getProperty("PID") == null) {
134+
System.setProperty("PID", getPid());
135+
}
136+
LoggingSystem loggingSystem = LoggingSystem.get(ClassUtils
137+
.getDefaultClassLoader());
138+
loggingSystem.beforeInitialize();
105139
}
106-
LoggingSystem loggingSystem = LoggingSystem.get(event.getSpringApplication()
107-
.getClass().getClassLoader());
108-
loggingSystem.beforeInitialize();
109140
}
110141

111142
/**
112143
* Initialize the logging system according to preferences expressed through the
113144
* {@link Environment} and the classpath.
114145
*/
115-
@Override
116-
public void initialize(ConfigurableApplicationContext applicationContext) {
117-
118-
ConfigurableEnvironment environment = applicationContext.getEnvironment();
146+
protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) {
119147

120148
if (this.parseArgs && this.springBootLogging == null) {
121149
if (environment.containsProperty("debug")) {
@@ -134,7 +162,7 @@ public void initialize(ConfigurableApplicationContext applicationContext) {
134162
}
135163
}
136164

137-
LoggingSystem system = LoggingSystem.get(applicationContext.getClassLoader());
165+
LoggingSystem system = LoggingSystem.get(classLoader);
138166

139167
// User specified configuration
140168
if (environment.containsProperty("logging.config")) {

spring-boot/src/main/java/org/springframework/boot/liquibase/LiquibaseServiceLocatorInitializer.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import org.apache.commons.logging.Log;
77
import org.apache.commons.logging.LogFactory;
88
import org.springframework.boot.SpringApplicationStartEvent;
9-
import org.springframework.context.ApplicationContextInitializer;
109
import org.springframework.context.ApplicationListener;
11-
import org.springframework.context.ConfigurableApplicationContext;
1210
import org.springframework.util.ClassUtils;
1311

1412
/**
@@ -19,7 +17,6 @@
1917
* @author Dave Syer
2018
*/
2119
public class LiquibaseServiceLocatorInitializer implements
22-
ApplicationContextInitializer<ConfigurableApplicationContext>,
2320
ApplicationListener<SpringApplicationStartEvent> {
2421

2522
static final Log logger = LogFactory.getLog(LiquibaseServiceLocatorInitializer.class);
@@ -31,10 +28,6 @@ public void onApplicationEvent(SpringApplicationStartEvent event) {
3128
}
3229
}
3330

34-
@Override
35-
public void initialize(ConfigurableApplicationContext applicationContext) {
36-
}
37-
3831
/**
3932
* Inner class to prevent class not found issues
4033
*/

spring-boot/src/main/resources/META-INF/spring.factories

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ org.springframework.boot.context.initializer.ConfigFileApplicationContextInitial
44
org.springframework.boot.context.initializer.FileEncodingApplicationContextInitializer,\
55
org.springframework.boot.context.initializer.ContextIdApplicationContextInitializer,\
66
org.springframework.boot.context.initializer.EnvironmentDelegateApplicationContextInitializer,\
7-
org.springframework.boot.context.initializer.LoggingApplicationContextInitializer,\
8-
org.springframework.boot.context.initializer.VcapApplicationContextInitializer,\
7+
org.springframework.boot.context.initializer.VcapApplicationContextInitializer
8+
9+
# Application Listeners
10+
org.springframework.context.ApplicationListener=\
11+
org.springframework.boot.context.listener.LoggingApplicationListener,\
912
org.springframework.boot.liquibase.LiquibaseServiceLocatorInitializer

0 commit comments

Comments
 (0)