Различие между getRootConfigClasses () и getServletConfigClasses () в AbstractAnnotationConfigDispatcherServletInitializer - PullRequest
1 голос
/ 14 июня 2019

Какова цель каждой функции. Почему Spring дал две разные функции для классов конфигурации? Я запутался между двумя, какой из них я должен использовать?

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

В типичном приложении Spring есть 2 ApplicationContext экземпляра, один - это так называемый корневой контекст приложения, а второй (или третий или ...) - сервлет . контекст приложения.

Приложение root обычно содержит общие / общие ресурсы, такие как DataSource, службы, репозитории и т. Д. ... Контекст servlet содержит компоненты, специфичные для этого контекста, обычно такие вещи, как view resolver, отображения обработчиков, контроллеры и т. д. Контекст сервлета использует корневой контекст в качестве родительского и, таким образом, может видеть определенные в нем bean-компоненты (корень не знает о контекстах сервлета!).

В этой типовой настройке корневой контекст загружается ContextLoaderListener, а контекст сервлета - DispatcherServlet.

В старые времена можно было написать web.xml, который содержал бы servlet-listener для ContextLoaderListener и servlet для DispatcherServlet.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Spring child -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

ContextLoaderListener будет загружать applicationContext.xml по умолчанию и DispatcherServlet a <servlet-name>-servlet.xml (следовательно, dispatcher-servlet.xml).

Начиная со спецификации Servlet 3.0, можно заменить web.xml конфигурацией на основе Java. Spring взял время, чтобы предоставить базовые классы, которые уже выполняют базовую настройку (например, регистрация ContextLoaderListener и DispatcherServlet). Однако, поскольку теперь это полностью конфигурация на основе Java, и ContextLoaderListener, и DispatcherServlet необходимо предоставить список классов конфигурации, так как нет имени класса по умолчанию, которое он может обнаружить для загрузки.

Таким образом, getRootConfigClasses() настроит ContextLoaderListener и на самом деле является необязательным (вы можете вернуть null или пустой массив). getServletConfigClasses() настроит DispatcherServlet (и обязательно).

1 голос
/ 17 июня 2019

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.html

createRootApplicationContext () The returned context ... will be established as the parent context for any DispatcherServlet application contexts. As such, it typically contains middle-tier services, data sources, etc.

createServletApplicationContext () The returned context ... typically contains controllers, view resolvers, locale resolvers, and other web-related beans.

Полное объяснение различий между сервлетом и корневым контекстом: В чем разница между ApplicationContext и WebApplicationContext в Spring MVC?

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