Skip to content

Commit a1fbd1e

Browse files
committed
Improve Servlet, Filter, and EventListener configuration diagnostics
ServletContextInitializerBeans handles existing registration beans and also creates initializers for existing Servlet, Filter, etc beans. Debug logging has been added to this class to improve things in three main areas: - Distinguish between existing registration beans and those that are created to wrap a Servlet or Filter bean - Provide information about the resource (configuration class or XML) that resulted in the creation of the bean - Log information about EventListeners Closes spring-projectsgh-2177
1 parent 1d31217 commit a1fbd1e

File tree

1 file changed

+48
-15
lines changed

1 file changed

+48
-15
lines changed

spring-boot/src/main/java/org/springframework/boot/context/embedded/ServletContextInitializerBeans.java

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@
3333
import javax.servlet.MultipartConfigElement;
3434
import javax.servlet.Servlet;
3535

36+
import org.apache.commons.logging.Log;
37+
import org.apache.commons.logging.LogFactory;
3638
import org.springframework.beans.factory.ListableBeanFactory;
39+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
3740
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
3841
import org.springframework.util.LinkedMultiValueMap;
3942
import org.springframework.util.MultiValueMap;
@@ -57,6 +60,8 @@ class ServletContextInitializerBeans extends
5760

5861
static final String DISPATCHER_SERVLET_NAME = "dispatcherServlet";
5962

63+
private final Log log = LogFactory.getLog(getClass());
64+
6065
private final Set<Object> seen = new HashSet<Object>();
6166

6267
private final MultiValueMap<Class<?>, ServletContextInitializer> initializers;
@@ -79,36 +84,55 @@ public ServletContextInitializerBeans(ListableBeanFactory beanFactory) {
7984
private void addServletContextInitializerBeans(ListableBeanFactory beanFactory) {
8085
for (Entry<String, ServletContextInitializer> initializerBean : getOrderedBeansOfType(
8186
beanFactory, ServletContextInitializer.class)) {
82-
addServletContextInitializerBean(initializerBean.getValue());
87+
addServletContextInitializerBean(initializerBean.getKey(),
88+
initializerBean.getValue(), beanFactory);
8389
}
8490
}
8591

86-
private void addServletContextInitializerBean(ServletContextInitializer initializer) {
92+
private void addServletContextInitializerBean(String beanName,
93+
ServletContextInitializer initializer, ListableBeanFactory beanFactory) {
8794
if (initializer instanceof ServletRegistrationBean) {
88-
addServletContextInitializerBean(Servlet.class, initializer,
89-
((ServletRegistrationBean) initializer).getServlet());
95+
addServletContextInitializerBean(Servlet.class, beanName, initializer,
96+
beanFactory, ((ServletRegistrationBean) initializer).getServlet());
9097
}
9198
else if (initializer instanceof FilterRegistrationBean) {
92-
addServletContextInitializerBean(Filter.class, initializer,
93-
((FilterRegistrationBean) initializer).getFilter());
99+
addServletContextInitializerBean(Filter.class, beanName, initializer,
100+
beanFactory, ((FilterRegistrationBean) initializer).getFilter());
94101
}
95102
else if (initializer instanceof ServletListenerRegistrationBean) {
96-
addServletContextInitializerBean(EventListener.class, initializer,
103+
addServletContextInitializerBean(EventListener.class, beanName, initializer,
104+
beanFactory,
97105
((ServletListenerRegistrationBean<?>) initializer).getListener());
98106
}
99107
else {
100-
addServletContextInitializerBean(ServletContextInitializer.class,
101-
initializer, null);
108+
addServletContextInitializerBean(ServletContextInitializer.class, beanName,
109+
initializer, beanFactory, null);
102110
}
103111
}
104112

105-
private void addServletContextInitializerBean(Class<?> type,
106-
ServletContextInitializer initializer, Object source) {
113+
private void addServletContextInitializerBean(Class<?> type, String beanName,
114+
ServletContextInitializer initializer, ListableBeanFactory beanFactory,
115+
Object source) {
107116
this.initializers.add(type, initializer);
108117
if (source != null) {
109118
// Mark the underlying source as seen in case it wraps an existing bean
110119
this.seen.add(source);
111120
}
121+
if (this.log.isDebugEnabled()) {
122+
String resourceDescription = getResourceDescription(beanName, beanFactory);
123+
int order = getOrder(initializer);
124+
this.log.debug("Added existing " + type.getSimpleName()
125+
+ " initializer bean '" + beanName + "'; order=" + order
126+
+ ", resource=" + resourceDescription);
127+
}
128+
}
129+
130+
private String getResourceDescription(String beanName, ListableBeanFactory beanFactory) {
131+
if (beanFactory instanceof BeanDefinitionRegistry) {
132+
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
133+
return registry.getBeanDefinition(beanName).getResourceDescription();
134+
}
135+
return "unknown";
112136
}
113137

114138
@SuppressWarnings("unchecked")
@@ -141,12 +165,21 @@ private <T, B extends T> void addAsRegistrationBean(ListableBeanFactory beanFact
141165
List<Map.Entry<String, B>> beans = getOrderedBeansOfType(beanFactory, beanType);
142166
for (Entry<String, B> bean : beans) {
143167
if (this.seen.add(bean.getValue())) {
168+
int order = getOrder(bean.getValue());
169+
String beanName = bean.getKey();
144170
// One that we haven't already seen
145-
RegistrationBean registration = adapter.createRegistrationBean(
146-
bean.getKey(), bean.getValue(), beans.size());
147-
registration.setName(bean.getKey());
148-
registration.setOrder(getOrder(bean.getValue()));
171+
RegistrationBean registration = adapter.createRegistrationBean(beanName,
172+
bean.getValue(), beans.size());
173+
registration.setName(beanName);
174+
registration.setOrder(order);
149175
this.initializers.add(type, registration);
176+
177+
if (this.log.isDebugEnabled()) {
178+
this.log.debug("Created " + type.getSimpleName()
179+
+ " initializer for bean '" + beanName + "'; order=" + order
180+
+ ", resource="
181+
+ getResourceDescription(beanName, beanFactory));
182+
}
150183
}
151184
}
152185
}

0 commit comments

Comments
 (0)