|
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