当前位置: 首页 > 面试题库 >

Spring实际上如何引导?

曾奇略
2023-03-14
问题内容
  1. 有人知道Spring实际上是如何引导的吗?
  2. 哪些实例由谁创建?
  3. 我真的很想知道谁创建了WebApplicationContext和ContextLoader实例。是Tomcat的作品吗?

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

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

Servlet 3功能可以实现这一功能。

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

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



 类似资料:
  • 问题内容: 我在项目中使用Spring Data JPA仓库已有一段时间了,我知道以下几点: 在存储库接口中,我们可以添加类似的方法(假设和是域对象中的字段)。 然后,Spring通过在运行时(在应用程序运行期间)实现上述存储库接口方法来提供实现。 我对它的编码方式很感兴趣,并查看了Spring JPA源代码和API,但是找不到以下问题的答案: 如何在运行时生成存储库实现类以及如何实现和注入方法?

  • 问题内容: 编译器或OS如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?两者都使用的程序具有相同的汇编代码。如何特别注意使操作原子化? 问题答案: 不是原子数据类型。仅仅是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此最好将其名称理解为“相对于信号处理而言是原子的”。 为了保证与信号处理程序之间的通信,仅需要原子数据类型的属性之一,即读取和更新将始终看

  • 问题内容: 我有一个Applet,它使用URLConnection通过HTTP连接加载图像。我正在为所有连接设置setUseCaches(true),但仍然看不到任何缓存行为。我图像的HTTP标头具有合理的缓存设置。如果您查看错误4528599,则有一个相当神秘的陈述: Java插件的当前版本(1.3.1)仅检查浏览器缓存中名称以.jar或.class结尾的文件。我被告知,对于Java Plug-

  • 问题内容: 我在JVM中运行了两个单独的缓存(一个由第三方库控制),每个缓存都使用软引用。我希望JVM在库控制的缓存之前先清除受控的缓存。SoftReference javadoc指出: 在虚拟机引发OutOfMemoryError之前,确保已清除所有对软可访问对象的软引用。否则,在清除软引用的时间或清除对不同对象的一组此类引用的时间上将没有任何限制。但是,鼓励虚拟机实现偏向于清除最近创建或最近使

  • 问题内容: 首先,我要说我知道它是什么,做什么以及如何使用它。这个问题关系到它在引擎盖下的工作方式,我不希望出现“这就是如何用” 循环数组”的答案。 很长时间以来,我一直认为该方法可用于数组本身。然后,我发现了很多关于它可以与数组 副本 一起使用的事实的引用,从那时起,我一直以为这是故事的结尾。但是我最近对此事进行了讨论,经过一番实验后发现这实际上并非100%正确。 让我表明我的意思。对于以下测试

  • 问题内容: 实际如何运作?是否可以对未指定的元素起作用?它是否偏向于具有指定元素的元素(即使它们位于顶部)? 这样的数字是否必须为负数? 或不?所有正数(以递增值表示)会以最后一个在顶部,中间在中间,第一个在底部为结尾吗? 问题答案: 允许使用负整数和正整数。 必须在元素上设置位置。 不过,在深入了解这些细节之前,让我从头开始进行解释。 每个网页都由所谓的堆栈上下文组成。从字面上看,您可以将它们视