Роль / назначение ContextLoaderListener весной?



Я учусь Spring Framework, который используется в моем проекте. Я нашел ContextLoaderListener вход в мой web.xml. Но не могли понять, как именно это помогает разработчику?



в официальной документации ContextLoaderListener он говорит, что это для начала WebApplicationContext. Относительно WebApplicationContext JavaDocs говорят:




интерфейс для настройки веб-приложения.






Но я не в состоянии понять, чего я добиваюсь с ContextLoaderListener который внутренне инициализирует WebApplicationContext ?



в моем понимании,ContextLoaderListener читает файл конфигурации Spring (со значением, заданным в contextConfigLocation in web.xml), анализирует его и загружает бин определена в файле config. Аналогично, когда мы хотим загрузить прототип фасоли, мы будем использовать тот же контекст веб-приложения, чтобы загрузить его. Поэтому мы инициализируем веб-приложение с помощью ContextLoaderListener чтобы мы читали/анализировали / проверяли файл конфигурации заранее, и всякий раз, когда мы хотим ввести зависимость, мы можем сразу же сделать это без каких-либо задержек. Правильно ли это понимание?

614   14  

14 ответов:

ваше понимание правильно. Элемент ApplicationContext где живут ваши весенние бобы. Цель ContextLoaderListener в два раза:

  1. чтобы связать жизненный цикл ApplicationContext к жизненному циклу ServletContext и

  2. автоматизировать создание ApplicationContext, поэтому вам не нужно писать явный код, чтобы создать его - это функция удобства.

еще одна удобная вещь о ContextLoaderListener это он создает WebApplicationContext и WebApplicationContext предоставляет доступ к ServletContext через ServletContextAware бобы и getServletContext метод.

ContextLoaderListener и дополнительно. Просто чтобы подчеркнуть здесь: вы можете загрузить приложение Spring без какой-либо настройки ContextLoaderListener, просто базовый минимум web.xml С DispatcherServlet.

вот как это будет выглядеть:

web.xml

<?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_2_5.xsd" 
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5">
  <display-name>Some Minimal Webapp</display-name>
  <welcome-file-list>   
    <welcome-file>index.jsp</welcome-file>    
  </welcome-file-list>

  <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>*.do</url-pattern>
  </servlet-mapping>
</web-app>

создайте файл с именем dispatcher-servlet.xml и хранить его в WEB-INF. Так как мы упомянули index.jsp в списке приветствий добавьте этот файл под WEB-INF.

диспетчер-сервлета.xml

на dispatcher-servlet.xml определите ваши бобы:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd     
        http://www.springframework.org/schema/context     
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="bean1">
      ...
    </bean>
    <bean id="bean2">
      ...
    </bean>         

    <context:component-scan base-package="com.example" />
    <!-- Import your other configuration files too -->
    <import resource="other-configs.xml"/>
    <import resource="some-other-config.xml"/>

    <!-- View Resolver -->
    <bean 
        id="viewResolver" 
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
      <property 
          name="viewClass" 
          value="org.springframework.web.servlet.view.JstlView" />
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
    </bean>
</beans>

для простого весеннего приложения вам не нужно определять ContextLoaderListener в своем web.xml; вы можете просто поместить все ваши файлы конфигурации Spring в <servlet>:

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc-core-config.xml, classpath:spring/business-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

для более сложных Spring-приложения, где у вас есть несколько DispatcherServlet определено, вы можете иметь общие файлы конфигурации Spring, которые являются общими для всех DispatcherServlet определена в ContextLoaderListener:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/common-config.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>mvc1</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc1-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>mvc2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc2-config.xmll</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

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

Я нашел, что эта статья очень помогает: Spring MVC-контекст приложения против контекста веб-приложения

блог, " назначение ContextLoaderListener-Spring MVC" дает очень хорошее объяснение.

согласно ему, контексты приложений являются иерархическими и, следовательно, контекст DispatcherSerlvet становится дочерним контекстом ContextLoaderListener. Благодаря чему, технология, используемая в слое контроллера (Struts или Spring MVC), может не зависеть от корневого контекста, созданного ContextLoaderListener.

Если вы хотите поместить свой файл сервлета в свое пользовательское местоположение или с пользовательским именем, а не с Соглашением об именовании по умолчанию [servletname]-servlet.xml и путь под Web-INF/ ,тогда вы можете использовать ContextLoaderListener.

ContextLoaderListner-это прослушиватель сервлетов, который загружает все различные файлы конфигурации (конфигурация уровня обслуживания, конфигурация уровня сохраняемости и т. д.) В один контекст приложения spring.

Это помогает разделить конфигурации весны через множественные файлы XML.

после загрузки файлов контекста Spring создает объект WebApplicationContext на основе определения компонента и сохраняет его в ServletContext вашего веб-приложения.

в основном вы можете изолировать корневой контекст приложения и контекст веб-приложения с помощью ContextLoaderListner.

конфигурационный файл, сопоставленный с контекстным параметром, будет вести себя как конфигурация контекста корневого приложения. И конфигурационный файл, сопоставленный с сервлетом диспетчера, будет вести себя как контекст веб-приложения.

в любом веб-приложении у нас может быть несколько сервлетов диспетчера, поэтому несколько контекстов веб-приложения.

но в любом веб-приложении мы можем имейте только один корневой контекст приложения, который является общим для всех контекстов веб-приложения.

мы должны определить наши общие службы, сущности, аспекты и т. д. В контексте корневого приложения. И контроллеры, перехватчики и т. д. в соответствующих контекста web-приложения.

пример web.xml-это

<!-- language: xml -->
<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>example.config.AppConfig</param-value>
    </context-param>
    <servlet>
        <servlet-name>restEntryPoint</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.RestConfig</param-value>
        </init-param>       
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>restEntryPoint</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>webEntryPoint</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.WebConfig</param-value>
        </init-param>       
        <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet-mapping>
        <servlet-name>webEntryPoint</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app> 

вот пример класса конфигурации.конфиг.AppConfig можно использовать для настройки служб, сущностей, аспектов и т. д. В контексте корневого приложения, который будет совместно использоваться со всеми другими контексты веб-приложений (например, здесь у нас есть два класса конфигурации контекста веб-приложения RestConfig и WebConfig)

PS: здесь ContextLoaderListener является полностью необязательным. Если мы не будем упоминать ContextLoaderListener в интернете.xml здесь, AppConfig не будет работать. В этом случае нам нужно настроить все наши службы и объекты в Webconfig и REST Config.

Это даст вам точку крючка, чтобы поместить некоторый код, который вы хотите выполнить на время развертывания веб-приложения

enter image description hereэтот загрузочный слушатель должен запустить и выключить Spring's root WebApplicationContext. Поскольку веб-приложение может иметь несколько диспетчерских сервлетов и каждый из них имеет свой собственный контекст приложения, содержащий контроллеры, распознаватель представлений, сопоставления обработчиков и т. д., Но вы можете иметь служебные компоненты, компоненты DAO в корневом контексте приложения и хотите использовать во всех дочерних контекстах приложения(контекст приложения, созданный диспетчером сервлеты.)

2-е использование этого слушателя, когда вы хотите использовать spring security.

ваше понимание правильно. Интересно, почему вы не видите никаких преимуществ в ContextLoaderListener. Например, вам нужно построить фабрику сеансов (для управления базой данных). Эта операция может занять некоторое время, поэтому лучше сделать это при запуске. Конечно, вы можете сделать это с помощью init-сервлетов или чего-то еще, но преимущество подхода Spring заключается в том, что вы делаете конфигурацию без написания кода.

Если мы пишем веб.xml без ContextLoaderListener, то мы не можем дать athuntication с помощью customAuthenticationProvider в spring security. Поскольку DispatcherServelet является дочерним контекстом ContextLoaderListener, customAuthenticationProvider является частью parentContext, который является ContextLoaderListener. Поэтому родительский Контекст не может иметь зависимости от контекста. И поэтому лучше всего писать spring-context.XML в contextparam вместо того, чтобы писать его в initparam.

Я считаю, что его реальное использование происходит, когда вы хотите иметь более одного файла конфигурации или у вас есть xyz.xml файл вместо applicationcontext.xml для eg

<context-param><param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/training-service.xml, /WEB-INF/training-data.xml</param-value> </context-param>

другой подход к ContextLoaderListener использует ContextLoaderServlet, как показано ниже

<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

класс слушателя-прослушивает событие (например.. Запуск/выключение сервера)

ContextLoaderListener -

  1. прослушивает во время запуска/выключения сервера
  2. принимает файлы конфигурации Spring в качестве входных данных и создает бобы в соответствии с конфигурацией и делает его готовым (уничтожает Боб во время выключения)
  3. файлы конфигурации могут быть предоставлены таким образом в интернете.xml

    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  
    

в контексте spring framework цель ContextLoaderListener это загрузка других компонентов в приложении, таких как компоненты среднего уровня и уровня данных, которые управляют задней частью приложения.

Comments

    Ничего не найдено.