Spring Framework'te applicationContext.xml ve spring-servlet.xml arasındaki fark


373
  • Are applicationContext.xmlve spring-servlet.xmlBahar Çerçevede nasıl olsa ilgili?
  • Bildirilen özellikler dosyaları applicationContext.xmlkullanılabilir olacak DispatcherServletmı?
  • İlgili bir notta, neden hiç ihtiyacım var *-servlet.xml? applicationContext.xmlYalnız neden yetersizdir?

Yanıtlar:


430

Bahar, bir üst-alt hiyerarşisinde birden çok bağlam tanımlamanıza olanak tanır.

applicationContext.xmlYani webapp ile ilişkili bağlamda "kök Webapp bağlamında" için fasulyeleri tanımlar.

spring-servlet.xml(Veya başka ne diyoruz) bir servlet'in uygulama bağlam için fasulyeleri tanımlar. Bunların birçoğu her Bahar sunucu uygulaması için bir web uygulamasında (örneğin spring1-servlet.xmlsunucu uygulaması spring1, spring2-servlet.xmlsunucu uygulaması için spring2) olabilir.

Fasulye spring-servlet.xmlfasulye fasulye referans olabilir applicationContext.xml, ama tersi değil.

Tüm Spring MVC kontrolörleri spring-servlet.xmlbağlam içinde olmalıdır .

Çoğu basit durumda, applicationContext.xmlbağlam gereksizdir. Genellikle bir web uygulamasındaki tüm sunucu uygulamaları arasında paylaşılan fasulye içermek için kullanılır. Yalnızca bir sunucu uygulamanız varsa, belirli bir kullanımınız olmadıkça gerçekten fazla bir şey yoktur.


30
neden birden fazla yaylı servisçiniz olsun ki?
NimChimpsky

5
kudretli güçlü cevap (kısa ve özlü olma)
ampütan

35
@NimChimpsky bazen uygulamanızın aynı bağlamda çakışabilecek bölümlerini ayırmak yararlı olabilir. Örnek olarak, ReST hizmetlerine ve standart görünümlere sahip olabilirsiniz, daha sonra görünümlerle ilgili hizmetler için farklı görünüm çözümleyicilere veya güvenlik endişelerine sahip olabilirsiniz.
Brett Ryan

12
İnsanlar belgeleri okumadan ve uygulama geliştirmeden önce bu yanıtı görmelidir! Normal durumlarda, ContextLoaderListener ve contextConfigLocation'a sahip olmanıza gerek yoktur, sadece DispatcherServlet!
ruruskyi

24
Pek çok öğreticide contextConfigLocation, dispatcher-servlet.xml ve DispatcherServlet öğelerini içerir. Bu fasulye iki kez başlatılmasına neden olur!
ruruskyi

106

Senaryo 1

İstemci uygulamasında (uygulama web uygulaması değildir, örneğin swing uygulaması olabilir)

private static ApplicationContext context = new  ClassPathXmlApplicationContext("test-client.xml");

context.getBean(name);

Web.xml dosyasına gerek yoktur . Fasulye servisi almak için konteyner olarak ApplicationContext. Web sunucusu kapsayıcısına gerek yoktur. In test client.xml hiçbir remoting Basit fasulye, Remoting ile fasulye olabilir.

Sonuç : Senaryo 1'de applicationContext ve DispatcherServletilişkili değildir.

Senaryo 2

Bir sunucu uygulamasında (sunucuya dağıtılan uygulama, örneğin Tomcat). İstemci programından (örn. Swing uygulaması) uzaklaşarak erişilen hizmet

Web.xml dosyasında dinleyiciyi tanımlayın

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

Sunucu başlangıcında applicationContext.xmlContextLoaderListener dosyasında tanımlanan çekirdekleri başlatır .

ApplicationContext.xml dosyasında aşağıdakileri tanımladığınızı varsayarsak :

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Çekirdekler test1.xml , test2.xml , test3.xml , test4.xml dosyasının dört yapılandırma dosyasından da somutlaştırılır .

Sonuç : Senaryo 2'de applicationContext ve DispatcherServletilişkili değildir.

Senaryo 3

Bahar MVC ile bir web uygulamasında.

Gelen Web.xml tanımlar:

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

Tomcat başladığında, springweb-servlet.xml dosyasında tanımlanan fasulye başlatılır. DispatcherServletuzanır FrameworkServlet. Gelen FrameworkServletfasulye örnekleme springweb için gerçekleşir. Bizim durumumuzda springweb FrameworkServlet.

Sonuç : Senaryo 3'te applicationContext ve DispatcherServletilişkili değildir.

Senaryo 4

Bahar MVC ile web uygulamasında. servlet için springweb-servlet.xml ve sunucu programındaki işletme hizmetine veya başka bir sunucu programındaki DB hizmetine erişmek için applicationContext.xml .

Gelen Web.xml şu şekilde tanımlanmıştır:

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

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        
</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

Sunucu başlangıcında, applicationContext.xmlContextLoaderListener dosyasında tanımlanan çekirdekleri başlatır ; burada beyan ettiğiniz varsayılarak:

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Fasulyelerin hepsi dört test1.xml , test2.xml , test3.xml , test4.xml'den somutlaştırılır . Tanımlanan fasulye örnekleme işlemi tamamlandıktan sonra applicationContext.xml , fasulye tanımlanan springweb-servlet.xml örneği.

Örnekleme sırası şudur: kök (uygulama bağlamı), ardından FrameworkServlet.

Şimdi hangi senaryoda niçin önemli oldukları açık olmalıdır.


10
+1. Çok iyi.Bu tür bir karşılaştırma arıyordum, ama hiç bulunamadı.
Ninad Pingale

@abishkar bhattarai çok iyi, sorum şu: "Senaryo 4" olduğunda fasulye oluşturmak için @ Component ve @ Value ek açıklamasını kullanıyorsanız
lawrence

springweb DispatcherServletURL değil .action ile biterse denilen olmaz?
Asif Mushtaq

@lawrence Spring'in bu bileşeni taramasında bulabilmesi için yine de springweb-servlet.xml dosyasındaki sınıf yolunu belirtmeniz gerekir.
veritas

54

Eklemek istediğim bir nokta daha var. Gelen spring-servlet.xmlbiz Kontrolör paketi için bileşen tarama içerir. Aşağıdaki örnekte, denetleyici paketi için filtre açıklaması ekledik.

<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="org.test.web" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

İçinde applicationcontext.xmlkontrolör hariç kalan paket için filtre ekliyoruz.

<context:component-scan base-package="org.test">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

9
neden ? Neden her şeyi bir kez taramıyorsunuz?
NimChimpsky

3
@NimChimpsky @ControllerFasulyeleri sunucu uygulaması bağlamında taramanız gerekir (Spring MVC için gereklidir).
Tuukka Mustonen

3
Neden her şey iki kez olamaz? Neden dahil / hariç tutmalı?
Mike Rylander

8
Ayrıca spring-servlet.xml dosyasına use-default-filters = "false" niteliği eklenmelidir
Rakesh Waghela

4
Rakesh Waghela'nın bir anlamı var. Bu özellik olmadan Denetleyici çekirdekleri iki kez oluşturulur. Birincisi appContext ve ikincisi servletContext
UltraMaster

12

Basit bir deyişle,

applicationContext.xmlBütün kuleler arasında paylaşılan fasulyeleri tanımlar. Uygulamanız birden fazla sunucu uygulamasına sahipse, ortak kaynakların tanımlanması applicationContext.xmldaha mantıklı olacaktır.

spring-servlet.xmlsadece bu sunucu uygulamasına bağlı olan fasulyeleri tanımlar. İşte görev dağıtıcı sunucu uygulaması. Bu nedenle, Spring MVC denetleyicilerinizin bu dosyada tanımlanması gerekir.

spring-servlet.xmlWeb uygulamanızda yalnızca bir sunucu uygulaması çalıştırıyorsanız , tüm çekirdekleri tanımlamakta yanlış bir şey yoktur .


3
Tüm çekirdekleri spring-servlet.xml dosyasında tanımlayabilirim, ancak bu durumda boş (fasulye olmadan) olabilecek applicationContext.xml de olmalıdır. Doğru?
Mikhail Kopylov

6

Servlet teknolojisinde herhangi bir girişi belirli bir sunucu uygulamasına iletmek istiyorsanız aşağıdaki kod gibi init parametresini geçirmeniz gerekir.

 <servlet>
    <servlet-name>DBController</servlet-name>
    <servlet-class>com.test.controller.DBController</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>John</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>DBController</servlet-name>
    <url-pattern>/DBController</url-pattern>
</servlet-mapping>

Tüm sunucu uygulamaları için ortak olan bazılarını geçmek istiyorsanız, o zaman bağlam parametresini yapılandırmanız gerekir. Misal

 <context-param>
    <param-name>email</param-name>
    <param-value>admin@example.com</param-value>
</context-param>

Bahar MVC ile çalışırken tam olarak böyle olduğu için, inatch param aracılığıyla, DispatcherServlet olan Spring tarafından sağlanan Öntanımlı sunucu uygulamasına bazı bilgiler sağlamalıyız. Yapılandırma nadas gibidir, burada DispatcherServlet'e spring-servlet.xml dosyasını init parametresi olarak sunuyoruz.

 <?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_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Spring MVC App</display-name>

    <servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
</web-app>

Yine bazı bağlam parametrelerine ihtiyacımız var. Bu tüm uygulama için geçerlidir. Yani applicationcontext.xml olan kök içeriği sağlayabiliriz Yapılandırma şöyle:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationcontext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

4

Uygulama bağlamları, bu mesajların i18n desteği de dahil olmak üzere metin mesajlarını çözmek için bir araç sağlar. Uygulama bağlamları, görüntüler gibi dosya kaynaklarını yüklemek için genel bir yol sağlar. Uygulama bağlamları, dinleyici olarak kayıtlı fasulye için olaylar yayınlayabilir. Fasulye fabrikasıyla programlı bir şekilde ele alınması gereken konteynır veya konteynır üzerindeki bazı operasyonlar, bir uygulama bağlamında deklaratif olarak gerçekleştirilebilir. ResourceLoader desteği: Spring'in Resource, bize düşük seviyeli kaynakları ele almak için esnek bir genel soyutlama arabirimi. Bir uygulama bağlamının kendisi bir ResourceLoader'dır, bu nedenle bir uygulamaya konuşlandırmaya özgü Kaynak örneklerine erişim sağlar. MessageSource desteği: Uygulama bağlamı, yerelleştirilmiş iletileri almak için kullanılan bir arabirim olan MessageSource'u,

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.