Понимание контекста приложений Spring MVC - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь понять основные вещи Spring MVC.

Рассмотрим web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Также рассмотрим диаграмму, приведенную в официальных документах * 1007.*:

enter image description here

Сомнения:

  1. Что такое точные типы экземпляров, создаваемых DispatcherServlet и ContextLoaderListener?Путаница возникает из-за того, что в некоторых статьях онлайн говорится, что ContextLoaderListener создает ApplicationContext экземпляр, а DispatcherServlet создает WebApplicationContext экземпляр.Но, посмотрев на их источник, я чувствую, что оба создают экземпляр типа WebApplicationContext, и, поскольку его подтип ApplicationContext, в некоторых статьях говорится, что ContextLoaderListener создает ApplicationContext экземпляр.Это также тот случай, когда используются только ApplicationContext -обеспечиваемые функциональные возможности экземпляра, созданного ContextLoaderListener, и, следовательно, в статье говорится, что ContextLoaderListener создает ApplicationContext, но не WebApplicationContext `
  2. Это похоже на WebApplicaionContext, созданный ContextLoaderListener, это то, что обычно онлайн статьи называют"root" WebApplicationContext, просто чтобы отличить его от WebApplicationContext s, созданных DispatcherServlet?

  3. Чтение этой статьи , я понял, что DispatcherServlet загружает файл [servlet-name]-servlet.xml, который должен загружать "компоненты веб-уровня".С другой стороны, ContextLoaderListener загружает «компоненты среднего уровня».Учитывая, что в файле web.xml может быть только один ContextLoaderListener (верно?), Должен быть только один единственный набор «компонентов среднего уровня», тогда как, поскольку может быть несколько DispatcherServlet s, может быть несколько наборов."компонентов веб-уровня".Это правильно?Если так, то почему на приведенной выше диаграмме показано несколько WebApplicationContext компонентов среднего уровня и один WebApplicationContext компонента веб-уровня?

1 Ответ

0 голосов
/ 03 октября 2018
  1. Оба WebApplicationContext и ApplicationContext являются интерфейсами , поэтому, когда документация говорит "создает ApplicationContext экземпляр", это означает, что она создает экземпляр объекта класса, который реализуетApplicationContext.Вопрос о том, реализует ли этот класс также WebApplicationContext, не имеет значения.Это может.Может и нет.Не делает недействительным утверждение о том, что оно «создает ApplicationContext экземпляр».

  2. , что обычно онлайн-статьи называют «root»

    Нет, это то, что сам javadoc ContextLoaderListener сам относится к корню:

    Выполняет фактическую работу инициализации для root контекст приложения.

  3. , почему на приведенной выше диаграмме показано несколько WebApplicationContexts компонентов среднего уровня и одно WebApplicationContextКомпонент веб-уровня?

    Он показывает только один WebApplicationContext компонент веб-уровня, потому что диаграмма для одного DispatcherServlet.

    Только потому, что ContextLoaderListenerсоздает только один корневой контекст, не означает, что несколько контекстов не могут быть созданы другими средствами.Диаграмма точно показывает, что возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...