- 有人知道Spring如何实际引导吗?
- 哪些实例是由谁创建的?
- 我真的想知道谁创建了WebApplicationContext和ContextLoader的实例。这是Tomcat的工作吗?
web.xml
文件。ContextLoaderListener
监听器(如果在web.xml
中定义为<listener>
),并执行以下操作:
ContextLoaderListener
创建新的WebApplicationContext
,使用应用程序上下文XML配置。BeanFactory
注册和实例化。DispatcherServlet
由Servlet容器实例化。
DispatcherServlet
使用ROOT上下文作为其父上下文,创建自己的WebApplicationContext
(默认为WEB-INF/{servletName}-servlet.xml
)。BeanFactory
注册和实例化。DispatcherServlet
会在必要时注册一些默认的bean。这是使用Servlet 3功能可以实现的。
以下是内容的翻译:ServiceLoader
搜索实现ServletContainerInitializer
的类。SpringServletContainerInitializer
。WebApplicationInitializer
的实现。WebApplicationInitializer
被找到(顺便说一句,检查一下它的JavaDoc!),并由SpringServletContainerInitializer
实例化。
WebApplicationInitializer
使用基于XML或@Configuration
的配置创建新的ROOTWebApplicationContext
。WebApplicationInitializer
使用基于XML或@Configuration
的配置创建新的servlet WebApplicationContext
。WebApplicationInitializer
创建并注册了一个新的DispatcherServlet
,其上下文来自前面的步骤。使用基于Java的方法更加灵活。您可以将上下文创建交给DispatcherServlet
,甚至可以将整个DispatcherServlet
实例化交给servlet容器(只需注册servlet DispatcherServlet.class
而不是其实例)。
ContextLoaderListener
必须在 web.xml
文件中声明为 <listener>
。web.xml
的结构和位置由 Servlet 规范明确定义。Tomcat 知道在哪里找到该文件以及如何处理其内容。 - Pavel HoralServletContextListener
是否真的是执行 SQL 迁移脚本的最佳位置?目前我不确定我的生产服务器何时以及如何应用这些脚本,我正在考虑在 ServletContextListener#contextInitialized
中执行此操作。 - Stefan Falk