स्प्रिंग MVC में ApplicationContext और WebApplicationContext में क्या अंतर है?


193

एप्लिकेशन प्रसंग और वेब अनुप्रयोग प्रसंग के बीच क्या अंतर है?

मुझे पता है कि WebApplicationContextस्प्रिंग एमवीसी आर्किटेक्चर उन्मुख अनुप्रयोगों के लिए उपयोग किया जाता है?

मैं जानना चाहता हूं कि ApplicationContextएमवीसी अनुप्रयोगों का क्या उपयोग है ? और किस प्रकार की फलियों में परिभाषित किया गया है ApplicationContext?


5
मुझे विश्वास नहीं होता है कि स्टैकओवरफ्लो का एक डुप्लिकेट है. com/ questions/3652090/… यह प्रश्न web.xmlफ़ाइल की सामग्री के बारे में पूछता है ; यह सवाल कुछ स्प्रिंग क्लासेस के बारे में पूछ रहा है।
राएडवल्ड

@Raedwald यह सच नहीं है। अन्य प्रश्न के बारे में बात नहीं कर रहा है, web.xmlलेकिन यह स्प्रिंग XML बीन कॉन्फ़िगरेशन वेरिएंट ApplicationContextऔर के बारे में बात कर रहा है WebApplicationContext। सभी बीन परिभाषाएँ applicationContext.xmlउपलब्ध होंगी ApplicationContextजबकि सभी बीन परिभाषाएँ *-servlet.xmlए में उपलब्ध होंगी WebApplicationContext
g00glen00b

जवाबों:


228

वेब अनुप्रयोग संदर्भ विस्तारित अनुप्रयोग संदर्भ जो मानक javax.servlet.ServletContext के साथ काम करने के लिए डिज़ाइन किया गया है, इसलिए यह कंटेनर के साथ संवाद करने में सक्षम है।

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

यदि वे ServletContextAware इंटरफ़ेस को लागू करते हैं तो बीन्स, WebApplicationContext में त्वरित रूप से ServletContext का उपयोग करने में सक्षम होंगे।

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

ServletContext उदाहरण के साथ करने के लिए कई चीजें संभव हैं, उदाहरण के लिए getResourceAsStream () विधि को कॉल करके WEB-INF संसाधनों (xml configs और आदि) तक पहुंचना। आमतौर पर सर्वलेट में web.xml में परिभाषित सभी एप्लिकेशन संदर्भ वेब अनुप्रयोग संदर्भ होते हैं, यह रूट वेबएप संदर्भ और सर्वलेट के ऐप संदर्भ दोनों पर जाता है।

इसके अलावा, वेब एप्लिकेशन संदर्भ क्षमताओं के आधार पर आपके एप्लिकेशन को परीक्षण करने के लिए थोड़ा कठिन हो सकता है, और आपको परीक्षण के लिए MockServletContext वर्ग का उपयोग करने की आवश्यकता हो सकती है ।

सर्वलेट और रूट संदर्भ के बीच अंतर स्प्रिंग आपको मल्टीलेवल एप्लिकेशन संदर्भ पदानुक्रम बनाने की अनुमति देता है, इसलिए आवश्यक बीन को मूल संदर्भ से लिया जाएगा यदि यह वर्तमान एप्लिकेशन संदर्भ में मौजूद नहीं है। डिफ़ॉल्ट रूप में वेब ऐप्स में दो पदानुक्रम स्तर, रूट और सर्वलेट संदर्भ हैं सर्वलेट और रूट संदर्भ:।

यह आपको संपूर्ण अनुप्रयोग के लिए एकल के रूप में कुछ सेवाएं चलाने की अनुमति देता है (स्प्रिंग सिक्योरिटी बीन्स और बेसिक डेटाबेस एक्सेस सर्विसेज आमतौर पर यहां रहती हैं) और दूसरा सेम के बीच नाम की गड़बड़ी से बचने के लिए संबंधित सर्वलेट्स में अलग सेवाओं के रूप में। उदाहरण के लिए एक सर्वलेट संदर्भ वेब पेजों की सेवा करेगा और दूसरा एक स्टेटलेस वेब सेवा को लागू करेगा।

जब आप स्प्रिंग सर्वलेट क्लासेस का उपयोग करते हैं, तो यह दो स्तर की जुदाई बॉक्स से बाहर निकलती है: रूट एप्लीकेशन संदर्भ को कॉन्फ़िगर करने के लिए आपको अपने web.xml में संदर्भ-परम टैग का उपयोग करना चाहिए

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

(रूट एप्लिकेशन संदर्भ ContextLoaderListener द्वारा बनाया गया है जो web.xml में घोषित किया गया है

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

) और सर्वलेट एप्लिकेशन संदर्भों के लिए सर्वलेट टैग

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

कृपया ध्यान दें कि यदि init-param को छोड़ दिया जाएगा, तो वसंत इस उदाहरण में myservlet-servlet.xml का उपयोग करेगा।

इसे भी देखें: स्प्रिंग फ्रेमवर्क में ApplicationContext.xml और Spring-servlet.xml के बीच अंतर


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

1
स्प्रिंग सर्वलेट टूल्स में ऐसी संरचना हार्डकोडेड है, स्प्रिंग वेब ऐप में हमेशा कम से कम दो एप्लिकेशन संदर्भ होते हैं, अपडेट किए गए उत्तर देखें, मुझे आशा है कि यह मदद करता है।
बोरिस ट्रेखोव

बहुत बढ़िया शिलालेख..मुझे इस परिदृश्य पर कुछ संदेह
था..क्योंकि

"आवश्यक बीन को मूल संदर्भ से प्राप्त किया जाएगा यदि यह वर्तमान एप्लिकेशन संदर्भ में मौजूद नहीं है"। क्या आप बता सकते हैं कैसे? वेब एप्लिकेशन संदर्भ रूट एप्लिकेशन संदर्भ में सेम तक कैसे पहुंच सकता है? किसी भी उदाहरण के लिए लिंक?
अनिरुद्ध

14

सर्वलेट दिनों में वापस जा रहे हैं, web.xml केवल एक ही हो सकता है <context-param>, इसलिए सर्वर द्वारा किसी एप्लिकेशन को लोड करने पर केवल एक संदर्भ ऑब्जेक्ट बन जाता है और उस संदर्भ में डेटा सभी संसाधनों (Ex: Servlets और JSPs) के बीच साझा किया जाता है। यह संदर्भ में डेटाबेस ड्राइवर का नाम होने जैसा ही है, जो नहीं बदलेगा। इसी तरह से, जब हम <contex-param>संदर्भ की घोषणा करते हैं, तो वसंत में कॉनफिग लाइटलोकेशन परम एक अनुप्रयोग संदर्भ वस्तु बनाता है।

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

आपके पास एक एप्लिकेशन में कई सर्वलेट हो सकते हैं। उदाहरण के लिए आप एक तरह से / सुरक्षित / * अनुरोधों को संभालना चाहते हैं और दूसरे तरीके से / गैर-सीक्रे / *। इन सर्वलेट्स में से प्रत्येक के लिए आपके पास एक संदर्भ ऑब्जेक्ट हो सकता है, जो एक WebApplicationContext है।

<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

स्वीकृत उत्तर के माध्यम से है, लेकिन इस पर आधिकारिक स्पष्टीकरण है:

WebApplicationContext सादे ApplicationContext का एक विस्तार है जिसमें वेब एप्लिकेशन के लिए कुछ अतिरिक्त सुविधाएं आवश्यक हैं। यह एक सामान्य ApplicationContext से भिन्न है कि यह विषयों को हल करने में सक्षम है (विषयों का उपयोग करके देखें), और यह जानता है कि यह किस Servlet से जुड़ा हुआ है (ServletContext का लिंक होने से)। WebApplicationContext ServletContext में बंधी है, और RequestContextUtils वर्ग पर स्थिर विधियों का उपयोग करके आप हमेशा WebApplicationContext देख सकते हैं यदि आपको इसकी आवश्यकता है।

स्प्रिंग वेब फ्रेमवर्क संदर्भ से उद्धृत

वैसे सर्वलेट और रूट संदर्भ दोनों WebApplicationContext हैं:

स्प्रिंग वेब एमवीसी में विशिष्ट संदर्भ पदानुक्रम


अच्छे खर्च।
शशांक

6

ApplicationContext (रूट अनुप्रयोग संदर्भ): प्रत्येक स्प्रिंग MVC वेब अनुप्रयोग में एक applicationContext.xml फ़ाइल होती है जिसे संदर्भ कॉन्फ़िगरेशन की जड़ के रूप में कॉन्फ़िगर किया गया है। स्प्रिंग इस फ़ाइल को लोड करता है और पूरे एप्लिकेशन के लिए एक एप्लिकेशन कॉन्टेक्स्ट बनाता है। यह फ़ाइल ContextLoaderListener द्वारा लोड की गई है जिसे web.xml फ़ाइल में एक संदर्भ परम के रूप में कॉन्फ़िगर किया गया है। और प्रति वेब एप्लिकेशन में केवल एक एप्लिकेशन कॉन्टेक्स्ट होगा।

WebApplicationContext: WebApplicationContext एक वेब अवेयर एप्लिकेशन संदर्भ है अर्थात इसमें सर्वलेट संदर्भ जानकारी है। एक एकल वेब अनुप्रयोग में कई WebApplicationContext हो सकते हैं और प्रत्येक डिस्पैचर सर्वलेट (जो स्प्रिंग MVC आर्किटेक्चर का फ्रंट कंट्रोलर है) एक WebApplicationContext के साथ जुड़ा हुआ है। WebApplicationContext कॉन्फ़िगरेशन फ़ाइल * -servlet.xml DispatcherServlet के लिए विशिष्ट है। और चूंकि एक वेब एप्लिकेशन में कई अनुरोधों को पूरा करने के लिए एक से अधिक डिस्पैचर सर्वलेट कॉन्फ़िगर किए जा सकते हैं, इसलिए प्रति वेब एप्लिकेशन में एक से अधिक webApplicationContext फाइल हो सकती है।


3

वेब अनुप्रयोग संदर्भ , WebApplicationContextइंटरफ़ेस द्वारा निर्दिष्ट , एक वेब अनुप्रयोगों के लिए एक स्प्रिंग अनुप्रयोग संदर्भ है। इसमें एक नियमित स्प्रिंग एप्लिकेशन संदर्भ के सभी गुण हैं, यह देखते हुए कि WebApplicationContextइंटरफ़ेस इंटरफ़ेस का विस्तार करता ApplicationContextहै, और ServletContextवेब एप्लिकेशन के लिए मानक सर्वलेट एपीआई को पुनर्प्राप्त करने के लिए एक विधि जोड़ें ।

मानक स्प्रिंग बीन स्कोप के अलावा singletonऔर prototype, एक वेब एप्लिकेशन के संदर्भ में तीन अतिरिक्त स्कोप उपलब्ध हैं:

  • request- एक एकल HTTP अनुरोध के जीवनचक्र के लिए एक एकल सेम परिभाषा; अर्थात्, प्रत्येक HTTP अनुरोध में एक सेम की परिभाषा के पीछे बंद बीन का अपना उदाहरण है
  • session - HTTP सत्र के जीवनचक्र में एकल बीन की परिभाषा
  • application - एक जीवन रेखा के लिए एक एकल बीन परिभाषा स्कोप a ServletContext
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.