Spring实际上是如何引导的?Servlet 上下文侦听器 (web.xml) 方法Servlet 容器初始值设定项(非 web.xml)方法
2022-09-02 19:32:34
- 有谁知道Spring实际上是如何引导的?
- 哪些实例由谁创建?
- 我真的很想知道谁创建了WebApplicationContext和ContextLoader的实例。是雄猫的作品吗?
web.xmlContextLoaderListener 正在由 servlet 容器实例化(如果定义为 在 内部)。<listener>web.xmlContextLoaderListener 使用应用程序上下文 XML 配置创建新的 WebApplicationContext。BeanFactory 在应用程序上下文中注册和实例化。DispatcherServlet 正在由 servlet 容器实例化。DispatcherServlet 创建自己的(缺省情况下)以 ROOT 上下文作为其父级。WebApplicationContextWEB-INF/{servletName}-servlet.xmlBeanFactory 在应用程序上下文中注册和实例化。DispatcherServlet 会注册一些默认的 Bean,以防您自己没有提供它们。这个可以通过Servlet 3功能实现。
ServiceLoader 实现 ServletContainerInitializer 的类。SpringServletContainerInitializer通过servlet容器找到并实例化。WebApplicationInitializer 实现。SpringServletContainerInitializer实例化。WebApplicationInitializerWebApplicationInitializer 使用 XML 或基于的配置创建新的 ROOT WebApplicationContext。@ConfigurationWebApplicationInitializer 使用 XML 或基于的配置创建新的 servlet WebApplicationContext。@ConfigurationWebApplication初始化程序将使用上一步中的上下文创建并注册新的内容。DispatcherServlet基于Java的方法更加灵活。您可以将上下文创建留给 servlet 容器,甚至将自身的整个实例化留给 servlet 容器(只需注册 servlet 而不是其实例)。DispatcherServletDispatcherServletDispatcherServlet.class
请参阅 http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/htmlsingle/#context-create。
原则是在标准 webapp 描述符 (web.xml)中声明一个 ServletContextListener。这样的侦听器确实由容器实例化,并在应用程序初始化和销毁时调用。
Spring提供了这样一个ServletContextListener:ContextLoaderListener,顾名思义,它在webapp初始化时加载Spring上下文。