Чим відрізняється ApplicationContext від WebApplicationContext у весняному MVC?


193

Чим відрізняється контекст програми та контекст веб-додатків?

Мені відомо, що WebApplicationContextвикористовується для Spring MVC орієнтованих на архітектуру додатків?

Хочу знати, в чому полягає використання програм ApplicationContextMVC? А який вид квасолі визначений ApplicationContext?


5
Я не вірю, що це дублікат stackoverflow.com/questions/3652090/… Це питання задає вміст web.xmlфайлу; це питання задає питання про деякі весняні заняття.
Raedwald

@Raedwald це неправда. Інше питання не стосується, web.xmlале це стосується варіантів конфігурації бобів Spring XML ApplicationContextта WebApplicationContext. Всі визначення квасолі в applicationContext.xmlбуде доступними в той ApplicationContextчас, як усі визначення бобів в. *-servlet.xmlБудуть доступні в WebApplicationContext.
g00glen00b

Відповіді:


228

Контекст веб-додатків розширений контекст програми, який призначений для роботи зі стандартним javax.servlet.ServletContext, щоб він міг спілкуватися з контейнером.

public interface WebApplicationContext extends ApplicationContext {
    ServletContext getServletContext();
}

Фасолі, створені в WebApplicationContext, також зможуть використовувати ServletContext, якщо вони реалізують інтерфейс ServletContextAware

package org.springframework.web.context;
public interface ServletContextAware extends Aware { 
     void setServletContext(ServletContext servletContext);
}

З екземпляром ServletContext можна зробити багато речей, наприклад, отримати доступ до ресурсів WEB-INF (конфігурації xml тощо), зателефонувавши методу getResourceAsStream (). Зазвичай всі контексти додатків, визначені в web.xml у весняній програмі сервлетів, є контекстами веб-додатків; це стосується як контексту кореневого веб-сайту, так і контексту програми сервлета.

Крім того, залежно від можливостей контексту веб-додатків може зробити ваш додаток дещо складнішим для тестування, і вам може знадобитися використовувати клас MockServletContext для тестування.

Різниця між сервлетом та кореневим контекстом Spring дозволяє створювати багаторівневі ієрархії контексту додатків, тому необхідний квадратик буде вилучений з батьківського контексту, якщо його немає в поточному контексті програми. У веб - додатках за замовчуванням є два рівня ієрархії, кореневі і сервлетів контексти: Сервлет і кореневий контекст.

Це дозволяє запускати деякі сервіси як одиночні кнопки для всієї програми (Spring Security боби та основні служби доступу до бази даних, як правило, проживають тут), а інші як окремі сервіси у відповідних сервлетах, щоб уникнути сутичок імен між квасолями. Наприклад, один контекст сервлету буде обслуговувати веб-сторінки, а інший реалізовуватиме веб-службу без громадянства.

Це два рівні розділення виходять з поля, коли ви використовуєте весняні класи сервлетів: для налаштування контексту кореневої програми слід використовувати тег контекст-парам у своєму веб.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(контекст кореневого додатку створюється ContextLoaderListener, який оголошено в web.xml

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

) І сервлет тег для контексту програми сервлету

<servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>app-servlet.xml</param-value>
   </init-param>
</servlet>

Зверніть увагу, що якщо init-param буде опущено, то в цьому прикладі весна використовуватиме myservlet-servlet.xml.

Дивіться також: Різниця між applicationContext.xml та spring-servlet.xml у Spring Framework


2
Велике спасибі за відповідь. Я чув, що існує два типи контекстів, які також використовуються для веб-програми. Один служить як контекст кореневого додатка, де надаються не пов’язані з веб-визначеннями приклади служби, конфігурації дао тощо, а другий - для конфігурації веб-сторінок, наприклад, Handp Mappings тощо. Попередній виступає як батьківський контекст, а останній виступає як дочірній контекст. . Я хочу знати, як оголосити цю структуру. Я чув про деякі зворотні виклики ContextListener. Але мені це досить незрозуміло.
Суміт Трехан

1
Така структура жорстко кодується у інструментах весняних сервлетів, у весняному веб-додатку завжди є щонайменше два контексти додатків, дивіться оновлену відповідь, я сподіваюся, що це допоможе.
Борис Треухов

Відмінно описуюсь. У мене виникли певні сумніви щодо цього сценарію ... тому що я на початковій стадії знайшов корисну відповідь для отримання певних знань ..
user533

"необхідний боб буде вилучений з батьківського контексту, якщо він не присутній у поточному контексті програми". Чи можете ви пояснити, як? Як контекст веб-додатків може отримати доступ до бобів у кореневому застосуванні? Посилання на будь-який приклад?
анір

14

Повертаючись до днів сервлетів, web.xml може мати лише один <context-param>, тому лише один контекстний об’єкт створюється, коли сервер завантажує програму, а дані в цьому контексті діляться між усіма ресурсами (наприклад: сервлети та JSP). Це те саме, що мати ім'я драйвера Database у контексті, яке не зміниться. Аналогічним чином, коли ми заявляємо, що параметр contextConfigLocation <contex-param>навесні створює один об'єкт контексту програми.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

У програмі можна мати кілька сервлетів. Наприклад, ви можете хотіти обробляти / захищати / * запити в одну сторону та / непереробляти / * іншим способом. Для кожного з цих сервлетів ви можете мати контекстний об'єкт, який є WebApplicationContext.

<servlet>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.secure.SecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.non-secure.NonSecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <url-pattern>/non-secure/*</url-patten>
</servlet-mapping>

14

Прийнята відповідь наскрізь, але на це є офіційне пояснення:

WebApplicationContext - це розширення простого ApplicationContext, яке має деякі додаткові функції, необхідні для веб-додатків. Він відрізняється від звичайного ApplicationContext тим, що здатний вирішувати теми (див. Використання тем) і тим, що він знає, з яким сервлетом він пов'язаний (маючи посилання на ServletContext). WebApplicationContext зв'язаний у ServletContext, і, використовуючи статичні методи класу RequestContextUtils, ви завжди можете шукати WebApplicationContext, якщо вам потрібен доступ до нього.

Цитується з посилань на веб-рамки Spring

До речі контекст сервлету і кореневої є як webApplicationContext:

Типова ієрархія контексту у весняному веб-MVC


гарне пояснення.
Шашанк

6

ApplicationContext (контекст Root Application): Кожна весняна веб-програма MVC має файл applicationContext.xml, який налаштований як корінь конфігурації контексту. Spring завантажує цей файл і створює applicationContext для всієї програми. Цей файл завантажується ContextLoaderListener, який налаштований як параметр контексту у файлі web.xml. І буде лише одна applicationContext на веб-додаток.

WebApplicationContext: WebApplicationContext - це контекст програми, що обізнаний у мережі, тобто інформація про контекст сервлетів. Один веб-додаток може мати декілька WebApplicationContext, і кожен сервлет Dispatcher (який є переднім контролером архітектури Spring MVC) асоціюється з WebApplicationContext. Файл конфігурації webApplicationContext * -servlet.xml специфічний для DispatcherServlet. Оскільки веб-додаток може мати більше одного сервлета диспетчера, налаштованого для обслуговування декількох запитів, на веб-додаток може бути більше одного файлу webApplicationContext.


3

Контекст веб-додатків , визначений WebApplicationContextінтерфейсом, є весняним контекстом для веб-додатків. Він має всі властивості звичайного контексту програми Spring, враховуючи, що WebApplicationContextінтерфейс розширює ApplicationContextінтерфейс і додає метод для отримання стандартного API сервлетів ServletContextдля веб-програми.

На додаток до стандартних областей весняного бобу singletonта prototypeв контексті веб-додатків доступні три додаткові області:

  • request- застосовує визначення одного квасолі до життєвого циклу одного запиту HTTP; тобто кожен запит HTTP має власний екземпляр bean, створений із зворотного боку єдиного визначення bean
  • session - застосовує визначення одного квасолі до життєвого циклу сесії HTTP
  • application - застосовує визначення одного квасолі до життєвого циклу а ServletContext
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.