स्प्रिंग फ्रेमवर्क में ApplicationContext.xml और spring-servlet.xml के बीच अंतर


373
  • कर रहे हैं applicationContext.xmlऔर spring-servlet.xmlस्प्रिंग फ्रेमवर्क में किसी भी तरह से संबंधित?
  • क्या घोषित की गई संपत्तियों की फाइलें applicationContext.xmlउपलब्ध होंगी DispatcherServlet?
  • संबंधित नोट पर, मुझे आखिर इसकी आवश्यकता क्यों है *-servlet.xml? applicationContext.xmlअकेले अपर्याप्त क्यों है ?

जवाबों:


430

स्प्रिंग आपको एक अभिभावक-बच्चे पदानुक्रम में कई संदर्भों को परिभाषित करने देता है।

applicationContext.xml"रूट webapp संदर्भ", यानी webapp के साथ जुड़े संदर्भ के लिए सेम परिभाषित करता है।

spring-servlet.xml(या जो भी किसी और आप इसे कहते हैं) एक सर्वलेट का एप्लिकेशन संदर्भ के लिए सेम परिभाषित करता है। वेबपे में इनमें से कई हो सकते हैं, एक प्रति स्प्रिंग सर्वलेट (उदाहरण के spring1-servlet.xmlलिए सर्वलेट spring1, spring2-servlet.xmlसर्वलेट के लिए spring2)।

सेम बीन्स spring-servlet.xmlको संदर्भ में ले सकते हैं applicationContext.xml, लेकिन इसके विपरीत नहीं।

सभी स्प्रिंग एमवीसी नियंत्रकों को spring-servlet.xmlसंदर्भ में जाना चाहिए ।

ज्यादातर साधारण मामलों में, applicationContext.xmlसंदर्भ अनावश्यक है। यह आमतौर पर सेम को सम्‍मिलित करने के लिए उपयोग किया जाता है जो एक वेबऐप में सभी सर्वलेट्स के बीच साझा किया जाता है। यदि आपके पास केवल एक सर्वलेट है, तो वास्तव में बहुत अधिक बिंदु नहीं है, जब तक कि आपके पास इसके लिए कोई विशिष्ट उपयोग न हो।


30
आपके पास कई स्प्रिंग सर्वलेट्स क्यों होंगे?
निमचिम्प्स्की

5
ताकतवर शक्तिशाली जवाब (
सक्सेस

35
@NimChimpsky यह कभी-कभी आपके आवेदन के अलग-अलग हिस्सों के लिए उपयोगी होता है जो अन्यथा उसी संदर्भ में संघर्ष कर सकते थे। एक उदाहरण के रूप में आपके पास रेस्ट सेवाएँ और मानक विचार हो सकते हैं, फिर आपके पास सेवाओं के लिए अलग-अलग दृश्य रिज़ॉल्वर या सुरक्षा चिंताएँ हो सकती हैं।
ब्रेट रायन

12
लोगों को दस्तावेज़ पढ़ने और एप्लिकेशन विकसित करने से पहले इस उत्तर को देखना चाहिए! सामान्य मामलों में ContextLoaderListener और ReferenceConfigLocation की बिल्कुल भी आवश्यकता नहीं है, बस डिस्पैचरवार्लेट!
रुरुस्की

24
कई ट्यूटोरियल्स के संदर्भ में कॉनफिगरेशन में डिस्पैचर-सर्वलेट.एक्सएमएल के साथ-साथ डिस्पैचर सेर्वलेट शामिल हैं। इससे फलियां दो बार प्रारंभिक हो जाती हैं!
रुरुस्की

106

दृष्टांत 1

क्लाइंट एप्लिकेशन में (एप्लिकेशन वेब एप्लिकेशन नहीं है, उदाहरण के लिए स्विंग ऐप हो सकता है)

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

context.getBean(name);

Web.xml की कोई आवश्यकता नहीं है । सेम सेवा प्राप्त करने के लिए कंटेनर के रूप में ApplicationContext। वेब सर्वर कंटेनर के लिए कोई ज़रूरत नहीं है। में परीक्षण client.xml कोई दूरस्थ के साथ सरल सेम, दूरस्थ बनाने के साथ सेम हो सकता है।

निष्कर्ष : परिदृश्य 1 में एप्लिकेशन कॉन्टेक्स्ट और DispatcherServletसंबंधित नहीं हैं।

दृश्य २

एक सर्वर अनुप्रयोग में (सर्वर में तैनात आवेदन जैसे कि Tomcat)। ग्राहक कार्यक्रम (जैसे स्विंग ऐप) से रिमोटिंग के माध्यम से पहुंच सेवा

वेब. xml में श्रोता को परिभाषित करें

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

सर्वर स्टार्टअप पर, ContextLoaderListenerApplicationContext.xml में परिभाषित बीन्स को त्वरित करता है

मान लें कि आपने applicationContext.xml में निम्नलिखित परिभाषित किया है :

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

सेम सभी चार विन्यास फाइलों test1.xml , test2.xml , test3.xml , test4.xml से त्वरित किया जाता है

निष्कर्ष : परिदृश्य 2 में ApplicationContext औरDispatcherServlet संबंधित नहीं हैं।

परिदृश्य 3

वसंत MVC के साथ एक वेब अनुप्रयोग में।

में web.xml निर्धारित किए हैं:

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

जब टॉमकैट शुरू होता है, तो स्प्रिंगवेब-सर्वलेट.एक्सएमएल में परिभाषित बीन्स को त्वरित किया जाता है। DispatcherServletफैली हुई है FrameworkServlet। में FrameworkServletसेम इन्स्टेन्शियशन springweb के लिए जगह लेता है। हमारे मामले में स्प्रिंगवेब फ्रेमवर्क है।

निष्कर्ष : परिदृश्य 3 में एप्लिकेशनकनेक्ट और DispatcherServletसंबंधित नहीं हैं।

दृश्य 4

वसंत MVC के साथ वेब अनुप्रयोग में। सर्वलेट के लिए springweb-servlet.xml और सर्वर प्रोग्राम के भीतर व्यावसायिक सेवा तक पहुँचने के लिए या किसी अन्य सर्वर प्रोग्राम में DB सेवा तक पहुँचने के लिए आवेदन करें।

में web.xml निम्नलिखित परिभाषित कर रहे हैं:

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

सर्वर स्टार्टअप पर, ContextLoaderListenerApplicationContext.xml में परिभाषित बीन्स को इंस्टेंट करता है ; यह मानते हुए कि आपने यहां घोषणा की है:

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

सेम सभी चार test1.xml , test2.xml , test3.xml , test4.xml से सभी तात्कालिक हैं । में परिभाषित सेम इन्स्टेन्शियशन पूरी होने के बाद applicationContext.xml , सेम में परिभाषित springweb-servlet.xml instantiated कर रहे हैं।

तो तात्कालिकता क्रम है: जड़ (अनुप्रयोग संदर्भ), फिर फ्रेमवर्क।

अब यह स्पष्ट होना चाहिए कि वे किस परिदृश्य में महत्वपूर्ण हैं।


10
+1। बहुत अच्छा।मैं इस प्रकार की तुलना की तलाश में था, लेकिन कभी नहीं मिला।
निनाद पिंगले

@abishkar bhattarai बहुत अच्छा है, मेरा सवाल है: तो क्या है अगर "परिदृश्य 4" बनाने के लिए सेम बनाने के लिए @ घटक और @ मूल्य एनोटेशन का उपयोग किया जा रहा है
लॉरेंस

स्प्रिंगवेलब DispatcherServletको नहीं कहा जाएगा यदि url .act के साथ समाप्त नहीं होता है?
आसिफ मुश्ताक

@ लॉरेंस आपको अभी भी स्प्रिंगवेब-सर्वलेट.एक्सएमएल में वर्ग पथ निर्दिष्ट करना होगा ताकि स्प्रिंग अपने स्कैन में उस घटक को पा सके।
वेरिटास

54

एक और बात मैं जोड़ना चाहता हूं। में spring-servlet.xmlहम नियंत्रक पैकेज के लिए घटक स्कैन शामिल हैं। निम्नलिखित उदाहरण में हम नियंत्रक पैकेज के लिए फ़िल्टर एनोटेशन शामिल करते हैं।

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

में applicationcontext.xmlहम नियंत्रक को छोड़कर शेष पैकेज के लिए फ़िल्टर जोड़ें।

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

9
क्यों ? सिर्फ एक बार पूरी चीज को स्कैन क्यों नहीं किया?
निमचिम्प्स्की

3
@NimChimpsky आपको @Controllerसर्वलेट संदर्भ में बीन्स को स्कैन करना होगा (स्प्रिंग एमवीसी द्वारा आवश्यक)।
तुकका मस्टोनन

3
पूरी बात दो बार क्यों नहीं हो सकती? क्यों शामिल / बहिष्कृत?
माइक रायलैंडर

8
वसंत-सर्वलेट.एक्सएमएल में उपयोग-डिफ़ॉल्ट-फिल्टर = "झूठा" गुण भी जोड़ना चाहिए
राकेश

4
राकेश वाघेला का इशारा है। उस विशेषता के बिना नियंत्रक बीन्स को दो बार बनाया जाएगा। पहला AppContext में और दूसरा सर्वलेट कॉन्टेक्स्ट में
UltraMaster

12

सरल शब्दों में,

applicationContext.xmlसेम को परिभाषित करता है जो सभी सर्वलेट्स के बीच साझा किया जाता है। यदि आपके आवेदन में एक से अधिक सर्वलेट हैं, तो में आम संसाधनों को परिभाषित करनाapplicationContext.xml अधिक समझ होगी।

spring-servlet.xmlबीन्स को परिभाषित करता है जो केवल उस सर्वलेट से संबंधित हैं। यहाँ यह डिस्पैचर सर्वलेट है। तो, आपके स्प्रिंग MVC नियंत्रकों को इस फ़ाइल में परिभाषित किया जाना चाहिए।

spring-servlet.xmlयदि आप अपने वेब एप्लिकेशन में केवल एक सर्वलेट चला रहे हैं तो सभी बीन्स को परिभाषित करने में कुछ भी गलत नहीं है ।


3
मैं सभी बीन्स को स्प्रिंग-सर्वलेट.एक्सएमएल में परिभाषित कर सकता हूं, लेकिन इस मामले में एप्लीकेशनकोनटेक्स्ट.एक्सएमएल भी खाली होना चाहिए (बीन्स के बिना)। सही बात?
मिखाइल कोप्पलोव

6

सर्वलेट टेक्नॉलॉजी में यदि आप किसी विशेष सर्वलेट में कोई इनपुट पास करना चाहते हैं तो आपको नीचे दिए गए कोड की तरह इनिट परम को पास करना होगा।

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

यदि आप पुट में कुछ पास करना चाहते हैं जो सभी सर्वलेट्स के लिए सामान्य है तो उस समय आपको संदर्भ परम को कॉन्फ़िगर करने की आवश्यकता है। उदाहरण

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

ठीक इसी तरह से जब हम कभी स्प्रिंग एमवीसी के साथ काम कर रहे होते हैं, तो हमें वसंत द्वारा प्रदान की जाने वाली पूर्वनिर्धारित सर्वलेट के लिए कुछ जानकारी प्रदान करने की आवश्यकता होती है जो कि इनफिट परम के माध्यम से डिस्पैचर सेर्वलेट है। तो कॉन्फ़िगरेशन फॉलोवर्स के रूप में है, यहां हम डिस्पैचर सेर्वलेट को इनिट पैरामीटर के रूप में स्प्रिंग-सर्वलेट.एक्सएमएल प्रदान कर रहे हैं।

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

फिर से हमें कुछ संदर्भ की आवश्यकता है। यह पूरे आवेदन के लिए लागू है। तो हम रूट संदर्भ प्रदान कर सकते हैं जो कि Applicationcontext.xml है। कॉन्फ़िगरेशन इस प्रकार है:

    <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

एप्लिकेशन संदर्भ पाठ संदेशों को हल करने के लिए एक साधन प्रदान करते हैं, जिसमें उन संदेशों के i18n के लिए समर्थन भी शामिल है। अनुप्रयोग संदर्भ फ़ाइल संसाधनों को लोड करने के लिए एक सामान्य तरीका प्रदान करते हैं, जैसे कि चित्र। एप्लिकेशन संदर्भों को श्रोताओं के रूप में पंजीकृत बीन्स की घटनाओं को प्रकाशित कर सकते हैं। कंटेनर में कंटेनर या सेम पर कुछ संचालन, जिन्हें एक सेम कारखाने के साथ प्रोग्रामेटिक फैशन में संभाला जाना है, को आवेदन के संदर्भ में घोषित रूप से नियंत्रित किया जा सकता है। रिसोर्सलॉडर समर्थन: स्प्रिंग का संसाधन हमें निम्न-स्तरीय संसाधनों को संभालने के लिए एक लचीली जेनेरिक अमूर्तता प्रदान करता है। एक आवेदन संदर्भ स्वयं एक रिसोर्सलॉडर है, इसलिए तैनाती-विशिष्ट संसाधन उदाहरणों तक पहुंच के साथ एक आवेदन प्रदान करता है। MessageSource समर्थन: अनुप्रयोग संदर्भ, MessageSource को लागू करता है, स्थानीय संदेशों को प्राप्त करने के लिए उपयोग किया जाने वाला इंटरफ़ेस,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.