web-gelistirme-sc.com

Spring MVC'deki ApplicationContext ve WebApplicationContext arasındaki fark nedir?

Uygulama İçeriği ile Web Uygulama İçeriği arasındaki fark nedir?

Spring MVC mimarisine yönelik uygulamalar için WebApplicationContext'nin kullanıldığını biliyorum?

MVC uygulamalarında ApplicationContext kullanımının ne olduğunu bilmek istiyorum? Ve ApplicationContext'da ne tür fasulye tanımlanır?

163
Sumit Trehan

Web Uygulaması bağlamı, javax.servlet.ServletContext standardıyla çalışmak üzere tasarlanmış Uygulama Bağlamını genişletti, böylece kapla iletişim kurabiliyordu. 

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

WebApplicationContext uygulamasında örneklenen fasulye'ler, ServletContextAware arabirimini uygularlarsa ServletContext'i de kullanabilir 

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

ServletContext örneği ile yapılabilecek birçok şey vardır, örneğin, WEB-INF kaynaklarına (xml yapılandırmaları ve vb.) GetResourceAsStream () yöntemini çağırarak erişme. Uygulama, Web Uygulaması bağlamlarıdır; bu, hem kök webapp içeriğine hem de sunucu uygulamasının uygulama içeriğine gider.

Ayrıca, web uygulaması bağlamı özelliklerine bağlı olarak, uygulamanızın test edilmesini biraz zorlaştırabilir ve test için MockServletContext sınıfını kullanmanız gerekebilir.

Servlet ve kök bağlam arasındaki fark Spring, çok seviyeli uygulama bağlamı hiyerarşileri oluşturmanıza izin verir, böylece mevcut uygulama bağlamında mevcut değilse gerekli fasulye ana bağlamdan alınacaktır. Web uygulamalarında varsayılan olarak iki hiyerarşi düzeyi vardır: kök ve sunucu uygulaması bağlamları: Servlet and root context

Bu, bazı hizmetleri tüm uygulama için tekli olarak çalıştırmanıza (Spring Security beans ve temel veritabanı erişim hizmetleri genellikle burada bulunur) ve başka bir tanesi, çekirdekler arasında ad çakışmalarını önlemek için karşılık gelen sunuculardaki ayrı hizmetler olarak çalıştırmanıza olanak tanır. Örneğin, bir sunucu uygulaması bağlamı web sayfalarına hizmet verecek ve bir diğeri vatansız bir web hizmeti uygulayacaktır.

Spring servlet sınıflarını kullandığınızda bu iki seviye ayrımı kutudan çıkar: kök uygulama bağlamını yapılandırmak için web.xml dosyanızda context-param etiketini kullanmalısınız.

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

(kök uygulama içeriği, web.xml dosyasında bildirilen ContextLoaderListener tarafından oluşturulur.

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

) and servlet sunucu uygulaması uygulama içerikleri için etiket

<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>

Lütfen init-param atlanırsa, o zaman baharın bu örnekte myservlet-servlet.xml kullanacağını unutmayın.

Ayrıca bakınız: SpringCity'de applicationContext.xml ve spring-servlet.xml arasındaki fark

213
Boris Treukhov

Servlet günlerine dönersek, web.xml yalnızca bir <context-param> dosyasına sahip olabilir, bu nedenle sunucu bir uygulama yüklediğinde yalnızca bir bağlam nesnesi oluşturulur ve bu bağlamdaki veriler tüm kaynaklar arasında paylaşılır (Örn: Servlets ve JSP'ler). Değişmez değişecek bağlamda, Veritabanı sürücüsü adına sahip olmakla aynı şeydir. Benzer şekilde, <contex-param> Spring'deki contextConfigLocation paramını bildirdiğimizde Spring bir Application Context nesnesi oluşturur.

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

Bir uygulamada birden fazla Sunucuya sahip olabilirsiniz. Örneğin,/secure/* isteklerini bir şekilde ve/seucre/* yöntemini başka bir şekilde ele almak isteyebilirsiniz. Bu Servletlerin her biri için bir WebApplicationContext olan bir bağlam nesnesine sahip olabilirsiniz.

<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>
8
Ben Tennyson

Kabul edilen cevap bitti ancak bununla ilgili resmi bir açıklama var:

WebApplicationContext, web uygulamaları için gerekli bazı ekstra özelliklere sahip olan düz ApplicationContext'in bir uzantısıdır. Temaları çözme kabiliyetine sahip olması (temaları kullanma konusuna bakın) ve hangi Servlet ile ilişkilendirildiğini bilmesi (ServletContext'e bir bağlantı kurarak) gibi normal bir ApplicationContext'ten farklıdır. WebApplicationContext, ServletContext'te bağlanmıştır ve RequestContextUtils sınıfındaki statik yöntemleri kullanarak, erişmeniz gerektiğinde her zaman WebApplicationContext'i arayabilirsiniz.

Bahar web çerçevesi referansından alıntı

Bu arada sunucu uygulaması ve kök bağlamı her ikisi de webApplicationContext:

Typical context hierarchy in Spring Web MVC

7
Nick Allen

WebApplicationContextNAME _ arabirimi tarafından belirtilen Web uygulaması içeriği , web uygulamaları için bir Bahar uygulaması bağlamıdır. WebApplicationContextarabiriminin ApplicationContextarabirimini genişletmesi ve web uygulaması için standart Servlet API ServletContextişlevini almak için bir yöntem eklemesi koşuluyla, düzenli bir Spring uygulama bağlamının tüm özelliklerine sahiptir.

Standart Spring fasulye kapsamlarına singletonve prototypeek olarak, bir web uygulaması bağlamında üç ek kapsam vardır:

  • request- tek bir HTTP isteğinin yaşam döngüsüne tek bir fasulye tanımlaması sunar; yani, her HTTP isteğinin, tek bir fasulye tanımının arkasından oluşturulan bir fasulye örneği vardır.
  • session- bir HTTP Seansının yaşam döngüsüne tek bir fasulye tanımı ekler
  • application- ServletContext'in kullanım ömrüne tek bir fasulye tanımı dahil eder
0
DimaSan

ApplicationContext (Root Application Context): Her Spring MVC web uygulamasında, içerik konfigürasyonunun kökü olarak yapılandırılmış bir applicationContext.xml dosyası bulunur. Spring, bu dosyayı yükler ve tüm uygulama için bir applicationContext oluşturur ..__ Bu dosya, web.xml dosyasında bir bağlam parametresi olarak yapılandırılmış ContextLoaderListener tarafından yüklenir. Ve web uygulaması başına sadece bir applicationContext olacaktır.

WebApplicationContext: WebApplicationContext, web uyumlu bir uygulama bağlamıdır, yani sunucu uygulaması bağlam bilgisi vardır. . WebApplicationContext yapılandırma dosyası * -servlet.xml, bir DispatcherServlet'e özeldir. Bir web uygulamasının birden fazla istekte bulunacak şekilde yapılandırılmış birden fazla gönderici sunucu uygulaması olabileceğinden, web uygulaması başına birden fazla webApplicationContext dosyası olabilir.

0
Hetal Rachh