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


193

Uygulama Bağlamı ile Web Uygulama Bağlamı arasındaki fark nedir?

WebApplicationContextBahar MVC mimarisi odaklı uygulamalar için kullanıldığını biliyorum ?

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


5
Bunun stackoverflow.com/questions/3652090/… bir kopyası olduğuna inanmıyorum Bu soru web.xmldosyanın içeriği hakkında sorar ; bu soru bazı bahar derslerini soruyor.
Raedwald

@Raedwald bu doğru değil. Diğer soru hakkında konuşmuyor web.xmlama Bahar XML fasulye yapılandırma varyantları bahsediyor ApplicationContextve WebApplicationContext. İçindeki tüm fasulye tanımları applicationContext.xmlmevcut ApplicationContextolurken, tüm fasulye tanımları *-servlet.xmla WebApplicationContext.
g00glen00b

Yanıtlar:


228

Web Uygulaması içeriği , konteynerle iletişim kurabilmesi için standart javax.servlet.ServletContext ile çalışmak üzere tasarlanmış Uygulama Bağlamını genişletti .

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

WebApplicationContext içinde örneklenen fasulye, ServletContextAware arabirimini uygularsa ServletContext'i de kullanabilecektir.

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

ServletContext örneğiyle yapılabilecek pek çok şey vardır, örneğin getResourceAsStream () yöntemini çağırarak WEB-INF kaynaklarına (xml config vb.) Erişme. Genellikle bir sunucu uygulaması Bahar uygulamasında web.xml dosyasında tanımlanan tüm uygulama bağlamları Web Uygulaması bağlamlarıdır, bu hem kök web uygulaması bağlamına hem de sunucu uygulamasının uygulama bağlamına gider.

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

Sunucu uygulaması ve kök bağlam arasındaki fark Yay, çok düzeyli uygulama bağlamı hiyerarşileri oluşturmanıza olanak tanır; böylece, geçerli uygulama bağlamında yoksa gerekli çekirdek üst bağlamdan getirilir. : Web uygulamaları varsayılan olarak iki hiyerarşi seviyeleri, kök ve servlet bağlamları vardır Sunucu uygulaması ve kök içeriği.

Bu, bazı hizmetleri tüm uygulama için tektonlar olarak (Spring Security çekirdekleri ve temel veritabanı erişim hizmetleri genellikle burada bulunur) ve diğer hizmetleri fasulye arasında ad çakışmasını önlemek için ilgili sunucu uygulamalarında ayrılmış hizmetler olarak çalıştırmanıza olanak tanır. Örneğin, bir sunucu uygulaması bağlamı web sayfalarına hizmet verirken, diğeri durum bilgisi olmayan bir web hizmeti uygulayacaktır.

Bu iki düzeyli ayırma, bahar sunucu uygulamaları sınıflarını kullandığınızda kutudan çıkar: kök uygulama içeriğini yapılandırmak için web.xml dosyasında context-param etiketi 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> 

) Ve servlet servlet uygulama bağlamlar 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>

İnit-param atlanırsa, yayın bu örnekte myservlet-servlet.xml kullanacaktır.

Ayrıca bkz: Spring Framework'te applicationContext.xml ve spring-servlet.xml arasındaki fark


2
Cevabınız için çok teşekkürler. Bir web uygulaması için de kullanılan iki tür bağlam olduğunu duydum. Biri, web ile ilgili olmayan tanımların örnek servis, dao yapılandırmaları vb. Sağlandığı kök uygulama bağlamı olarak işlev görür ve diğeri, İşleyici Eşlemeleri vb. Gibi web'e özgü yapılandırma içindir. . Bu yapıyı nasıl ilan edeceğimi bilmek istiyorum. Bazı ContextListener geri çağrılarını duydum. Ama bu konuda oldukça net değilim.
Sumit Trehan

1
Bu yapı Bahar servlet araçlarında sabit kodlanmıştır, bahar web uygulamasında her zaman en az iki uygulama bağlamı vardır, güncellenmiş cevaba bakın, umarım yardımcı olur.
Boris Treukhov

Mükemmel
tanımlaması

msgstr "geçerli uygulama bağlamında mevcut değilse gerekli fasulye üst bağlamdan getirilecek". Nasıl olduğunu açıklayabilir misin? Bir web uygulaması içeriği, kök uygulama bağlamında çekirdeklere nasıl erişebilir? Herhangi bir örneğe bağlantı?
anir

14

Servlet günlerine dönersek, web.xml dosyasında yalnızca bir tane olabilir <context-param>, bu nedenle sunucu bir uygulama yüklediğinde ve bu bağlamdaki veriler tüm kaynaklar arasında paylaşıldığında yalnızca bir bağlam nesnesi oluşturulur (Ör: Sunucular ve JSP'ler). Bağlamda değişmeyecek Veritabanı sürücüsü adı ile aynıdır. Benzer şekilde, Spring'de contextConfigLocation parametresini bildirdiğimizde <contex-param>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 Sunucu Uygulamanız olabilir. Örneğin, / secure / * isteklerini bir şekilde ve / seucre / * seçeneğini başka bir şekilde ele almak isteyebilirsiniz. Bu Sunucu Uygulamalarının 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>

14

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

WebApplicationContext, düz ApplicationContext öğesinin, web uygulamaları için gerekli bazı ekstra özelliklere sahip bir uzantısıdır. Temaları çözümleyebilmesi (bkz. Temaları kullanma) ve hangi Servlet ile ilişkili olduğunu (ServletContext'e bağlantı vererek) normal bir ApplicationContext'ten farklıdır. WebApplicationContext, ServletContext içinde bağlıdır ve RequestContextUtils sınıfındaki statik yöntemleri kullanarak, ona erişmeniz gerekiyorsa her zaman WebApplicationContext'i arayabilirsiniz.

Alıntı yapılan Spring web framework reference

Bu arada, sunucu uygulaması ve kök bağlamı hem webApplicationContext'tir:

Spring Web MVC'sinde tipik bağlam hiyerarşisi


iyi açıklama.
Shashank

6

ApplicationContext (Root Application Context): Her Spring MVC web uygulamasında, bağlam yapılandırmasının kökü olarak yapılandırılmış bir applicationContext.xml dosyası vardır. Spring bu dosyayı yükler ve tüm uygulama için bir applicationContext oluşturur. Bu dosya, web.xml dosyasında bağlam parametresi olarak yapılandırılan ContextLoaderListener tarafından yüklenir. Ve her bir web uygulaması için yalnızca bir applicationContext olacaktır.

WebApplicationContext: WebApplicationContext web uyumlu bir uygulama bağlamıdır, yani sunucu uygulaması bağlam bilgisine sahiptir. Tek bir web uygulamasında birden çok WebApplicationContext olabilir ve her bir Dispatcher sunucu uygulaması (Spring MVC mimarisinin ön denetleyicisi) bir WebApplicationContext ile ilişkilendirilir. WebApplicationContext yapılandırma dosyası * -servlet.xml, DispatcherServlet'e özgüdür. Ve bir web uygulamasında birden fazla istek sunmak üzere yapılandırılmış birden fazla dağıtım programı sunucuya sahip olabileceğinden, web uygulaması başına birden fazla webApplicationContext dosyası olabilir.


3

Web uygulama bağlamı tarafından belirtilen WebApplicationContextarayüz, bir web uygulamaları için bir yay uygulama içeriğidir. WebApplicationContextArabirimin arabirimi genişletmesi ve web uygulaması için ApplicationContextstandart Servlet API'sini almak için bir yöntem eklemesi koşuluyla, normal bir Spring uygulama içeriğinin tüm özelliklerine sahiptir ServletContext.

Standart Bahar fasulye ek olarak kapsamları singletonve prototypebir web uygulaması bağlamında kullanılabilir üç ek kapsam vardır:

  • request- tek bir HTTP isteğinin yaşam döngüsüne tek bir fasulye tanımı dahil eder; diğer bir deyişle, her HTTP isteğinin tek bir fasulye tanımının arkasından oluşturulan bir fasulye örneği vardır
  • session - HTTP Oturumunun yaşam döngüsüne tek bir fasulye tanımı dahil eder
  • application - tek bir fasulye tanımını, ServletContext
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.