|
16 | 16 |
|
17 | 17 | package org.springframework.boot.context.embedded; |
18 | 18 |
|
19 | | -import java.util.ArrayList; |
20 | 19 | import java.util.Collection; |
21 | | -import java.util.Collections; |
22 | | -import java.util.Comparator; |
23 | 20 | import java.util.EventListener; |
24 | | -import java.util.LinkedHashMap; |
25 | | -import java.util.LinkedHashSet; |
26 | | -import java.util.List; |
27 | | -import java.util.Map; |
28 | | -import java.util.Map.Entry; |
29 | | -import java.util.Set; |
30 | 21 |
|
31 | 22 | import javax.servlet.Filter; |
32 | | -import javax.servlet.MultipartConfigElement; |
33 | 23 | import javax.servlet.Servlet; |
34 | 24 | import javax.servlet.ServletConfig; |
35 | 25 | import javax.servlet.ServletContext; |
|
41 | 31 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
42 | 32 | import org.springframework.context.ApplicationContext; |
43 | 33 | import org.springframework.context.ApplicationContextException; |
44 | | -import org.springframework.core.annotation.AnnotationAwareOrderComparator; |
45 | 34 | import org.springframework.core.io.Resource; |
46 | 35 | import org.springframework.util.StringUtils; |
47 | 36 | import org.springframework.web.context.ContextLoader; |
@@ -94,7 +83,7 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext |
94 | 83 | * default. To change the default behaviour you can use a |
95 | 84 | * {@link ServletRegistrationBean} or a different bean name. |
96 | 85 | */ |
97 | | - public static final String DISPATCHER_SERVLET_NAME = "dispatcherServlet"; |
| 86 | + public static final String DISPATCHER_SERVLET_NAME = ServletContextInitializerBeans.DISPATCHER_SERVLET_NAME; |
98 | 87 |
|
99 | 88 | private EmbeddedServletContainer embeddedServletContainer; |
100 | 89 |
|
@@ -220,108 +209,11 @@ public void onStartup(ServletContext servletContext) throws ServletException { |
220 | 209 | /** |
221 | 210 | * Returns {@link ServletContextInitializer}s that should be used with the embedded |
222 | 211 | * Servlet context. By default this method will first attempt to find |
223 | | - * {@link ServletContextInitializer} beans, if none are found it will instead search |
224 | | - * for {@link Servlet} and {@link Filter} beans. |
| 212 | + * {@link ServletContextInitializer}, {@link Servlet}, {@link Filter} and certain |
| 213 | + * {@link EventListener} beans. |
225 | 214 | */ |
226 | 215 | protected Collection<ServletContextInitializer> getServletContextInitializerBeans() { |
227 | | - |
228 | | - List<ServletContextInitializer> filters = new ArrayList<ServletContextInitializer>(); |
229 | | - List<ServletContextInitializer> servlets = new ArrayList<ServletContextInitializer>(); |
230 | | - List<ServletContextInitializer> listeners = new ArrayList<ServletContextInitializer>(); |
231 | | - List<ServletContextInitializer> other = new ArrayList<ServletContextInitializer>(); |
232 | | - Set<Servlet> servletRegistrations = new LinkedHashSet<Servlet>(); |
233 | | - Set<Filter> filterRegistrations = new LinkedHashSet<Filter>(); |
234 | | - Set<EventListener> listenerRegistrations = new LinkedHashSet<EventListener>(); |
235 | | - |
236 | | - for (Entry<String, ServletContextInitializer> initializerBean : getOrderedBeansOfType(ServletContextInitializer.class)) { |
237 | | - ServletContextInitializer initializer = initializerBean.getValue(); |
238 | | - if (initializer instanceof ServletRegistrationBean) { |
239 | | - servlets.add(initializer); |
240 | | - ServletRegistrationBean servlet = (ServletRegistrationBean) initializer; |
241 | | - servletRegistrations.add(servlet.getServlet()); |
242 | | - } |
243 | | - else if (initializer instanceof FilterRegistrationBean) { |
244 | | - filters.add(initializer); |
245 | | - FilterRegistrationBean filter = (FilterRegistrationBean) initializer; |
246 | | - filterRegistrations.add(filter.getFilter()); |
247 | | - } |
248 | | - else if (initializer instanceof ServletListenerRegistrationBean) { |
249 | | - listeners.add(initializer); |
250 | | - listenerRegistrations |
251 | | - .add(((ServletListenerRegistrationBean<?>) initializer) |
252 | | - .getListener()); |
253 | | - } |
254 | | - else { |
255 | | - other.add(initializer); |
256 | | - } |
257 | | - } |
258 | | - |
259 | | - List<Entry<String, Servlet>> servletBeans = getOrderedBeansOfType(Servlet.class); |
260 | | - for (Entry<String, Servlet> servletBean : servletBeans) { |
261 | | - final String name = servletBean.getKey(); |
262 | | - Servlet servlet = servletBean.getValue(); |
263 | | - if (!servletRegistrations.contains(servlet)) { |
264 | | - String url = (servletBeans.size() == 1 ? "/" : "/" + name + "/"); |
265 | | - if (name.equals(DISPATCHER_SERVLET_NAME)) { |
266 | | - url = "/"; // always map the main dispatcherServlet to "/" |
267 | | - } |
268 | | - ServletRegistrationBean registration = new ServletRegistrationBean( |
269 | | - servlet, url); |
270 | | - registration.setName(name); |
271 | | - registration.setMultipartConfig(getMultipartConfig()); |
272 | | - registration.setOrder(CustomOrderAwareComparator.INSTANCE |
273 | | - .getOrder(servlet)); |
274 | | - servlets.add(registration); |
275 | | - } |
276 | | - } |
277 | | - |
278 | | - for (Entry<String, Filter> filterBean : getOrderedBeansOfType(Filter.class)) { |
279 | | - String name = filterBean.getKey(); |
280 | | - Filter filter = filterBean.getValue(); |
281 | | - if (!filterRegistrations.contains(filter)) { |
282 | | - FilterRegistrationBean registration = new FilterRegistrationBean(filter); |
283 | | - registration.setName(name); |
284 | | - registration.setOrder(CustomOrderAwareComparator.INSTANCE |
285 | | - .getOrder(filter)); |
286 | | - filters.add(registration); |
287 | | - } |
288 | | - } |
289 | | - |
290 | | - Set<Class<?>> listenerTypes = ServletListenerRegistrationBean.getSupportedTypes(); |
291 | | - for (Class<?> type : listenerTypes) { |
292 | | - for (Entry<String, ?> listenerBean : getOrderedBeansOfType(type)) { |
293 | | - String name = listenerBean.getKey(); |
294 | | - EventListener listener = (EventListener) listenerBean.getValue(); |
295 | | - if (ServletListenerRegistrationBean.isSupportedType(listener) |
296 | | - && !filterRegistrations.contains(listener)) { |
297 | | - ServletListenerRegistrationBean<EventListener> registration = new ServletListenerRegistrationBean<EventListener>( |
298 | | - listener); |
299 | | - registration.setName(name); |
300 | | - registration.setOrder(CustomOrderAwareComparator.INSTANCE |
301 | | - .getOrder(listener)); |
302 | | - listeners.add(registration); |
303 | | - } |
304 | | - } |
305 | | - } |
306 | | - AnnotationAwareOrderComparator.sort(filters); |
307 | | - AnnotationAwareOrderComparator.sort(servlets); |
308 | | - AnnotationAwareOrderComparator.sort(listeners); |
309 | | - AnnotationAwareOrderComparator.sort(other); |
310 | | - |
311 | | - List<ServletContextInitializer> list = new ArrayList<ServletContextInitializer>( |
312 | | - filters); |
313 | | - list.addAll(servlets); |
314 | | - list.addAll(listeners); |
315 | | - list.addAll(other); |
316 | | - return list; |
317 | | - } |
318 | | - |
319 | | - private MultipartConfigElement getMultipartConfig() { |
320 | | - List<Entry<String, MultipartConfigElement>> beans = getOrderedBeansOfType(MultipartConfigElement.class); |
321 | | - if (beans.isEmpty()) { |
322 | | - return null; |
323 | | - } |
324 | | - return beans.get(0).getValue(); |
| 216 | + return new ServletContextInitializerBeans(getBeanFactory()); |
325 | 217 | } |
326 | 218 |
|
327 | 219 | /** |
@@ -375,25 +267,6 @@ protected void prepareEmbeddedWebApplicationContext(ServletContext servletContex |
375 | 267 | } |
376 | 268 | } |
377 | 269 |
|
378 | | - private <T> List<Entry<String, T>> getOrderedBeansOfType(Class<T> type) { |
379 | | - List<Entry<String, T>> beans = new ArrayList<Entry<String, T>>(); |
380 | | - Comparator<Entry<String, T>> comparator = new Comparator<Entry<String, T>>() { |
381 | | - @Override |
382 | | - public int compare(Entry<String, T> o1, Entry<String, T> o2) { |
383 | | - return AnnotationAwareOrderComparator.INSTANCE.compare(o1.getValue(), |
384 | | - o2.getValue()); |
385 | | - } |
386 | | - }; |
387 | | - String[] names = getBeanFactory().getBeanNamesForType(type, true, false); |
388 | | - Map<String, T> map = new LinkedHashMap<String, T>(); |
389 | | - for (String name : names) { |
390 | | - map.put(name, getBeanFactory().getBean(name, type)); |
391 | | - } |
392 | | - beans.addAll(map.entrySet()); |
393 | | - Collections.sort(beans, comparator); |
394 | | - return beans; |
395 | | - } |
396 | | - |
397 | 270 | private void startEmbeddedServletContainer() { |
398 | 271 | if (this.embeddedServletContainer != null) { |
399 | 272 | this.embeddedServletContainer.start(); |
@@ -448,15 +321,4 @@ public EmbeddedServletContainer getEmbeddedServletContainer() { |
448 | 321 | return this.embeddedServletContainer; |
449 | 322 | } |
450 | 323 |
|
451 | | - private static class CustomOrderAwareComparator extends |
452 | | - AnnotationAwareOrderComparator { |
453 | | - |
454 | | - public static CustomOrderAwareComparator INSTANCE = new CustomOrderAwareComparator(); |
455 | | - |
456 | | - @Override |
457 | | - protected int getOrder(Object obj) { |
458 | | - return super.getOrder(obj); |
459 | | - } |
460 | | - } |
461 | | - |
462 | 324 | } |
0 commit comments