Spring实际上是如何引导的?Servlet 上下文侦听器 (web.xml) 方法Servlet 容器初始值设定项(非 web.xml)方法

2022-09-02 19:32:34
  1. 有谁知道Spring实际上是如何引导的?
  2. 哪些实例由谁创建?
  3. 我真的很想知道谁创建了WebApplicationContext和ContextLoader的实例。是雄猫的作品吗?

答案 1

Servlet 上下文侦听器 (web.xml) 方法

  1. 用户正在部署 Web 应用程序 WAR。
  2. Servlet container (Tomcat) 读取 .web.xml
  3. Servlet 上下文侦听器 ContextLoaderListener 正在由 servlet 容器实例化(如果定义为 在 内部)。<listener>web.xml
    1. ContextLoaderListener 使用应用程序上下文 XML 配置创建新的 WebApplicationContext
    2. 您的 ROOT 上下文 Bean 由 BeanFactory 在应用程序上下文中注册和实例化。
  4. DispatcherServlet 正在由 servlet 容器实例化。
    1. DispatcherServlet 创建自己的(缺省情况下)以 ROOT 上下文作为其父级。WebApplicationContextWEB-INF/{servletName}-servlet.xml
    2. 您的 servlet bean 由 BeanFactory 在应用程序上下文中注册和实例化。
    3. DispatcherServlet 会注册一些默认的 Bean,以防您自己没有提供它们。

Servlet 容器初始值设定项(非 web.xml)方法

这个可以通过Servlet 3功能实现。

  1. 用户正在部署 Web 应用程序 WAR。
  2. Servlet 容器搜索通过 Java 的 ServiceLoader 实现 ServletContainerInitializer 的类。
  3. Spring的SpringServletContainerInitializer通过servlet容器找到并实例化。
  4. Spring 的初始值设定项读取 Web 应用程序的类路径并搜索 WebApplicationInitializer 实现。
  5. 您的已找到(顺便说一句。检查其JavaDoc!!!并由SpringServletContainerInitializer实例化WebApplicationInitializer
    1. 您的 WebApplicationInitializer 使用 XML 或基于的配置创建新的 ROOT WebApplicationContext@Configuration
    2. 您的 WebApplicationInitializer 使用 XML 或基于的配置创建新的 servlet WebApplicationContext@Configuration
    3. WebApplication初始化程序将使用上一步中的上下文创建并注册新的内容。DispatcherServlet
  6. Servlet 容器完成 Web 应用程序初始化并实例化在前面的步骤中由其类注册的组件(在我的示例中没有)。

基于Java的方法更加灵活。您可以将上下文创建留给 servlet 容器,甚至将自身的整个实例化留给 servlet 容器(只需注册 servlet 而不是其实例)。DispatcherServletDispatcherServletDispatcherServlet.class


答案 2

请参阅 http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/htmlsingle/#context-create

原则是在标准 webapp 描述符 (web.xml)中声明一个 ServletContextListener。这样的侦听器确实由容器实例化,并在应用程序初始化和销毁时调用。

Spring提供了这样一个ServletContextListener:ContextLoaderListener,顾名思义,它在webapp初始化时加载Spring上下文。


推荐