Spring实际上是如何引导的?Servlet 上下文侦听器 (web.xml) 方法Servlet 容器初始值设定项(非 web.xml)方法
2022-09-02 19:32:34
- 有谁知道Spring实际上是如何引导的?
- 哪些实例由谁创建?
- 我真的很想知道谁创建了WebApplicationContext和ContextLoader的实例。是雄猫的作品吗?
web.xml
ContextLoaderListener
正在由 servlet 容器实例化(如果定义为 在 内部)。<listener>
web.xml
ContextLoaderListener
使用应用程序上下文 XML 配置创建新的 WebApplicationContext
。BeanFactory
在应用程序上下文中注册和实例化。DispatcherServlet
正在由 servlet 容器实例化。DispatcherServlet
创建自己的(缺省情况下)以 ROOT 上下文作为其父级。WebApplicationContext
WEB-INF/{servletName}-servlet.xml
BeanFactory
在应用程序上下文中注册和实例化。DispatcherServlet
会注册一些默认的 Bean,以防您自己没有提供它们。这个可以通过Servlet 3功能实现。
ServiceLoader
实现 ServletContainerInitializer
的类。SpringServletContainerInitializer
通过servlet容器找到并实例化。WebApplicationInitializer
实现。SpringServletContainerInitializer实例化
。WebApplicationInitializer
WebApplicationInitializer
使用 XML 或基于的配置创建新的 ROOT WebApplicationContext
。@Configuration
WebApplicationInitializer
使用 XML 或基于的配置创建新的 servlet WebApplicationContext
。@Configuration
WebApplication初始化程序
将使用上一步中的上下文创建并注册新的内容。DispatcherServlet
基于Java的方法更加灵活。您可以将上下文创建留给 servlet 容器,甚至将自身的整个实例化留给 servlet 容器(只需注册 servlet 而不是其实例)。DispatcherServlet
DispatcherServlet
DispatcherServlet.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上下文。