java - Spring实际上是如何引导的?

  1. 有人知道 Spring 实际上是如何引导的吗?
  2. 哪些实例由谁创建?
  3. 我真的很想知道是谁创建了 WebApplicationContext 和 ContextLoader 的实例。它是Tomcat的工作吗?

最佳答案

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

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

Servlet 容器初始化器(非 web.xml)方法

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

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

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

https://stackoverflow.com/questions/21714290/

相关文章:

java - 如何将 Class 值设置为 spring bean 属性?

java - Spring Security 匿名 401 而不是 403

java - Mybatis Spring多数据库Java配置

java - Spring Servlet 项目的 web.xml 中加载 contextConfi

java - 在 Spring 5 Webflux 中启用 CORS?

java - 为什么不推荐使用 HibernateTemplate?

java - hibernate 唯一 key 验证

java - 如何使用 Spring 为 JUnit 测试注入(inject) ServletCon

java - 如何从spring security获取当前登录的用户对象?

java - Spring MVC,转发