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




(4)

दृष्टांत 1

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

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

context.getBean(name);

Web.xml की कोई ज़रूरत नहीं है। बीन सेवा प्राप्त करने के लिए कंटेनर के रूप में ApplicationContext। वेब सर्वर कंटेनर की कोई ज़रूरत नहीं है। Test-client.xml में रीमोटिंग के साथ कोई रिमोटिंग, बीन के साथ सरल बीन हो सकता है।

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

परिदृश्य 2

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

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

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

सर्वर स्टार्टअप पर ContextLoaderListener applicationContext.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 अनुप्रयोग में कॉन्टेक्स्ट और DispatcherServlet संबंधित नहीं हैं।

परिदृश्य 3

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

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>

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

निष्कर्ष : परिदृश्य 3 अनुप्रयोग DispatcherServlet और DispatcherServlet से संबंधित नहीं हैं।

परिदृश्य 4

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

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>

सर्वर स्टार्टअप पर, ContextLoaderListener 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 से तत्काल हैंApplicationContext.xml में परिभाषित बीन तत्कालता को पूरा करने के बाद वसंतवेब-servlet.xml में परिभाषित बीन्स तत्काल होते हैं।

तो तात्कालिकता आदेश रूट है अनुप्रयोग संदर्भ, फिर फ्रेमवर्क सर्लेट।

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

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

एक और बिंदु मैं जोड़ना चाहता हूँ। 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>

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

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

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

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

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

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


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

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

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

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





spring