究 Spring 3.1之無web.xml式 基於代碼配置的servlet3.0應用

  你們應該都已經知道Spring 3.1對無web.xml式基於代碼配置的servlet3.0應用。經過spring的api或是網絡上高手們的博文,也必定很快就學會而且加到本身的應用中去了。PS:若是還沒,也能夠小小參考一下鄙人的上一篇文章<<探 Spring 3.1之無web.xml式 基於代碼配置的servlet3.0應用>>。

通過一天的深度research, 我瞭解,理解以及重現了springframework的那一小段代碼。

OK,第一步,入手點,WebApplicationInitializer接口。由於咱們只需實現這個接口覆寫它的一個方法,就能夠作到配置web.xml一樣的功效。看它的源碼,其實看和不看沒什麼兩樣: java

Java代碼 複製代碼 收藏代碼
  1. package org.springframework.web;
  2.  
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletException;
  5. public interface WebApplicationInitializer {
  6. void onStartup(ServletContext servletContext) throws ServletException;
  7. }


就這麼點兒,有效代碼5行,弄地我一頭霧水,就是一個普通接口,聲明瞭一個方法。連註解都沒有,server是怎麼找到實現了它的類的?若是這樣,何不找我定義的其它接口(的實現類完成配置工做)呢。可見如今java的解耦技術,真使人汗顏。
第二步,這個接口旁邊(同包)有個SpringServletContainerInitializer, 看下它是何方神聖吧:web

Java代碼 複製代碼 收藏代碼
  1. package org.springframework.web;
  2.  
  3. import java.lang.reflect.Modifier;
  4. import java.util.Collections;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.ServiceLoader;
  8. import java.util.Set;
  9. import javax.servlet.ServletContainerInitializer;
  10. import javax.servlet.ServletContext;
  11. import javax.servlet.ServletException;
  12. import javax.servlet.annotation.HandlesTypes;
  13.  
  14. import org.springframework.core.annotation.AnnotationAwareOrderComparator;
  15.  
  16. @HandlesTypes(WebApplicationInitializer.class)
  17. public class SpringServletContainerInitializer implements ServletContainerInitializer {
  18. public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
  19. throws ServletException {
  20.  
  21. List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
  22. if (webAppInitializerClasses != null) {
  23. for (Class<?> waiClass : webAppInitializerClasses) {
  24. // Be defensive: Some servlet containers provide us with invalid classes,
  25. // no matter what @HandlesTypes says...
  26. if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
  27. try {
  28. initializers.add((WebApplicationInitializer) waiClass.newInstance());
  29. }
  30. catch (Throwable ex) {
  31. throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
  32. }
  33. }
  34. }
  35. }
  36.  
  37. if (initializers.isEmpty()) {
  38. servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
  39. return;
  40. }
  41.  
  42. Collections.sort(initializers, new AnnotationAwareOrderComparator());
  43. servletContext.log("Spring WebApplicationInitializers detected on classpath: " + initializers);
  44.  
  45. for (WebApplicationInitializer initializer : initializers) {
  46. initializer.onStartup(servletContext);
  47. }
  48. }
  49.  
  50. }
相關文章
相關標籤/搜索