Роль / назначение ContextLoaderListener весной?
Я учусь Spring Framework, который используется в моем проекте. Я нашел ContextLoaderListener вход в мой web.xml. Но не могли понять, как именно это помогает разработчику?
в официальной документации ContextLoaderListener он говорит, что это для начала WebApplicationContext. Относительно WebApplicationContext JavaDocs говорят:
интерфейс для настройки веб-приложения.
Но я не в состоянии понять, чего я добиваюсь с ContextLoaderListener который внутренне инициализирует WebApplicationContext ?
в моем понимании,ContextLoaderListener читает файл конфигурации Spring (со значением, заданным в contextConfigLocation in web.xml), анализирует его и загружает бин определена в файле config. Аналогично, когда мы хотим загрузить прототип фасоли, мы будем использовать тот же контекст веб-приложения, чтобы загрузить его. Поэтому мы инициализируем веб-приложение с помощью ContextLoaderListener чтобы мы читали/анализировали / проверяли файл конфигурации заранее, и всякий раз, когда мы хотим ввести зависимость, мы можем сразу же сделать это без каких-либо задержек. Правильно ли это понимание?
14 ответов:
ваше понимание правильно. Элемент
ApplicationContextгде живут ваши весенние бобы. ЦельContextLoaderListenerв два раза:
чтобы связать жизненный цикл
ApplicationContextк жизненному циклуServletContextиавтоматизировать создание
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.
Это даст вам точку крючка, чтобы поместить некоторый код, который вы хотите выполнить на время развертывания веб-приложения
этот загрузочный слушатель должен запустить и выключить 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 -
- прослушивает во время запуска/выключения сервера
- принимает файлы конфигурации Spring в качестве входных данных и создает бобы в соответствии с конфигурацией и делает его готовым (уничтожает Боб во время выключения)
файлы конфигурации могут быть предоставлены таким образом в интернете.xml
<param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
в контексте spring framework цель ContextLoaderListener это загрузка других компонентов в приложении, таких как компоненты среднего уровня и уровня данных, которые управляют задней частью приложения.

Comments