भूमिका / वसंत में प्रसंगवशनामवाद का उद्देश्य?


169

मैं स्प्रिंग फ्रेमवर्क सीख रहा हूं जिसका उपयोग मेरी परियोजना में किया जा रहा है। मुझे अपनी web.xml फ़ाइल में ContextLoaderListener प्रविष्टि मिली । लेकिन यह पता नहीं लगा सका कि यह वास्तव में एक डेवलपर की मदद कैसे करता है?

ContextLoaderListener के आधिकारिक दस्तावेज में यह कहा गया है कि यह WebApplicationContext को शुरू करना है । WebApplicationContext JavaDocs के बारे में कहते हैं:

वेब एप्लिकेशन के लिए कॉन्फ़िगरेशन प्रदान करने के लिए इंटरफ़ेस।


लेकिन मुझे यह समझाया गया है कि मैं क्या कर रहा हूँ के साथ प्राप्त करने में सक्षम नहीं हूँ ContextLoaderListener जो आंतरिक रूप से आरंभ WebApplicationContext ?

मेरी समझ के अनुसार , ContextLoaderListener स्प्रिंग विन्यास फाइल (में contextConfigLocation के खिलाफ दिए गए मान के साथ पढ़ता web.xml ), यह और भार को पार्स करता सिंगलटन सेम कि कॉन्फ़िग फ़ाइल में परिभाषित किया। इसी तरह जब हम प्रोटोटाइप बीन को लोड करना चाहते हैं , तो हम इसे लोड करने के लिए उसी वेबएप्लिकेशन संदर्भ का उपयोग करेंगे। तो हम साथ WebApplication प्रारंभ ContextLoaderListener तो हम पहले से / पार्स / सत्यापित करें कॉन्फ़िग फ़ाइल पढ़ा है कि और जब भी हम इंजेक्षन निर्भरता को वान हम बिना किसी देरी के यह कर सीधे कर सकते हैं। क्या यह समझ सही है?


1
क्या कोई मुझे RequestContextListener और
ContextLoaderListener के

जवाबों:


111

आपकी समझ सही है। वह जगह ApplicationContextहै जहाँ आपके स्प्रिंग बीन्स रहते हैं। ContextLoaderListenerदो गुना का उद्देश्य है :

  1. के जीवन चक्र टाई ApplicationContextके जीवन चक्र को ServletContextऔर

  2. के निर्माण को स्वचालित करने के लिए ApplicationContext, इसलिए आपको इसे बनाने के लिए स्पष्ट कोड लिखने की आवश्यकता नहीं है - यह एक सुविधा कार्य है।

इसके बारे में एक और सुविधाजनक बात ContextLoaderListenerयह है कि यह एक बनाता है WebApplicationContextऔर सेम और विधि WebApplicationContextके ServletContextमाध्यम से पहुँच प्रदान करता है ।ServletContextAwaregetServletContext


2
मुझे आपके दूसरे बिंदु के बारे में संदेह है। आपने कहा कि ServletContextListener ServletContext तक पहुँच प्रदान करता है। लेकिन, भले ही web.xml में ServletContextListener न हो, ServletContext को WebApplicationContext (WebApplicationContext के माध्यम से स्वतः प्राप्त किया जा सकता है) तक पहुँचा जा सकता है। तो, क्या यह वास्तव में ServletContext से संबंधित है?
सुमित देसाई

यह बनाता है WebApplicationContext। अन्यथा इसे मैन्युअल रूप से बनाने की आवश्यकता होगी।
sourcedelica

ContextLoaderListenerजब वेब कंटेनर बंद हो जाता है तो सभी फलियों को नष्ट करने के लिए एक नष्ट विधि को लागू करता है ?
asgs

हाँ - यह करता है कि जब contextDestroyedकहा जाता है। एपीआई डॉक्स देखें।
sourcedelica

@sourcedelica मुझे एक संदेह है इसे पढ़ने के बाद मैंने अपने अनुप्रयोगों की जाँच की है web.xml। मेरी xml फ़ाइल में दो श्रोता हैं ContextLoaderListenerऔर DispatcherServlet। इसलिए मुझे लगता है कि दोनों की कोई आवश्यकता नहीं है, ContextLoaderListenerक्या मैं इसे हटाने के लिए सुरक्षित हूं क्योंकि मैं आवेदन कर रहा हूं क्योंकि 7-8 महीने से रहते हैं। web.xml आपके संदर्भ के लिए यहां है
अमोघ

43

ContextLoaderListenerहै वैकल्पिक । बस यहां एक बिंदु बनाने के लिए: आप कभी भी कॉन्फ़िगर किए बिना एक स्प्रिंग एप्लिकेशन को बूट कर सकते हैं ContextLoaderListener, बस एक मूल न्यूनतम के web.xmlसाथ DispatcherServlet

यहाँ है कि यह कैसा दिखेगा:

web.xml

<?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_2_5.xsd" 
    id="WebApp_ID" 
    version="2.5">
  <display-name>Some Minimal Webapp</display-name>
  <welcome-file-list>   
    <welcome-file>index.jsp</welcome-file>    
  </welcome-file-list>

  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

नामक एक फाइल बनाएं dispatcher-servlet.xmlऔर इसे स्टोर करें WEB-INF। चूंकि हमने index.jspस्वागत सूची में उल्लेख किया है, इसलिए इस फ़ाइल को नीचे जोड़ें WEB-INF

डिस्पैचर-servlet.xml

dispatcher-servlet.xmlअपनी बीन्स को परिभाषित करें:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd     
        http://www.springframework.org/schema/context     
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="bean1">
      ...
    </bean>
    <bean id="bean2">
      ...
    </bean>         

    <context:component-scan base-package="com.example" />
    <!-- Import your other configuration files too -->
    <import resource="other-configs.xml"/>
    <import resource="some-other-config.xml"/>

    <!-- View Resolver -->
    <bean 
        id="viewResolver" 
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
      <property 
          name="viewClass" 
          value="org.springframework.web.servlet.view.JstlView" />
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
    </bean>
</beans>

2
यदि यह वैकल्पिक है, जब आप चाहते हैं चाहते हैं इसका इस्तेमाल करने की? ऐसा लगता है कि स्प्रिंग सुरक्षा को डेलिगेटफिल्टरप्रॉक्सी का उपयोग करने की आवश्यकता है।
डेविड

6
आपको इसका उपयोग तब करना है जब आप अपने सर्वलेट फ़ाइल को अपने कस्टम स्थान या कस्टम नाम के साथ, डिफ़ॉल्ट नाम "[सर्वलेट-नाम] -servlet.xml" के बजाय "वेब-इन्फो /" के तहत पथ
करना चाहते हैं

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

8
आमतौर पर अपने आवेदन की वास्तुकला की परतों को दर्शाते हुए फलियों को वितरित करना बेहतर होता है। प्रस्तुति परत के लिए बीन्स (उदाहरण के लिए mvc नियंत्रकों) डिस्पैचर-सर्वलेट.एक्सएमएल में हो सकते हैं। सर्विस लेयर से संबंधित बीन्स को applicationContext.xml परिभाषित किया जाना चाहिए। यह एक सख्त नियम नहीं है, लेकिन चिंता को अलग करने के लिए यह एक अच्छा अभ्यास है।
क्लाउडियो वेन्टुरिनी

2
@ रमेश कर्ण मुझे नहीं लगता कि नाम और स्थान परिवर्तन की आवश्यकता है। मुझे लगता है कि जब हम कई डिस्पैचर सर्वलेट्स को इनिशियलाइज़ कर रहे हैं, तब भी इसकी ज़रूरत है और फिर भी रूट डिस्क्रिप्शन सभी डिस्पैटरसर्वलेट्स के स्वयं के संदर्भ द्वारा साझा किए जाने की आवश्यकता है, तब हमें कॉनटेक्स्टालैडरलिस्टनर का उपयोग करने की आवश्यकता है।
सुपरनोवा

23

एक साधारण स्प्रिंग एप्लिकेशन के लिए, आपको ContextLoaderListenerअपने में परिभाषित करने की आवश्यकता नहीं है web.xml; आप बस अपनी सभी स्प्रिंग कॉन्फ़िगरेशन फ़ाइलों को इसमें डाल सकते हैं <servlet>:

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc-core-config.xml, classpath:spring/business-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

अधिक जटिल स्प्रिंग एप्लिकेशन के लिए, जहां आपके पास कई DispatcherServletपरिभाषित हैं, आपके पास सामान्य स्प्रिंग कॉन्फ़िगरेशन फ़ाइलें हो सकती हैं जो सभी DispatcherServletपरिभाषित द्वारा साझा की जाती हैं ContextLoaderListener:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/common-config.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>mvc1</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc1-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>mvc2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc2-config.xmll</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

बस ध्यान रखें, रूट एप्लिकेशन संदर्भ के ContextLoaderListenerलिए वास्तविक आरंभीकरण कार्य करता है।

मैंने पाया कि यह लेख बहुत मदद करता है: स्प्रिंग एमवीसी - एप्लीकेशन कॉन्सेप्ट बनाम वेब एप्लीकेशन कॉन्सेप्ट


यहाँ साझा किया गया लेख वास्तव में अवधारणाओं की गहरी समझ सुनिश्चित करता है
प्रियांक ठक्कर

10

ब्लॉग, " कॉन्टेक्टलॉलाडरलीनर का उद्देश्य - स्प्रिंग एमवीसी " बहुत अच्छी व्याख्या देता है।

इसके अनुसार, एप्लीकेशन-कॉन्टेक्ट्स पदानुक्रम हैं और इसलिए डिस्पैचर सेर्लवेट का संदर्भ कॉन्टेक्स्टेलैडेरलिस्टनर के संदर्भ का बच्चा बन जाता है। जिसके कारण, नियंत्रक परत (स्ट्रट्स या स्प्रिंग एमवीसी) में इस्तेमाल की जा रही तकनीक रूट संदर्भ के संदर्भ में स्वतंत्र हो सकती है जो कॉन्टेक्स्टेलैडेरलिस्टनर बनाई गई है।


इसे शेयर करने के लिए धन्यवाद दोस्त .. :)
दीपक कुमार

3

जब आप अपने सर्वलेट फ़ाइल को अपने कस्टम लोकेशन में या कस्टम नाम के साथ रखना चाहते हैं, बजाय डिफ़ॉल्ट नामकरण कन्वेंशन [servletname]-servlet.xmlऔर अंडर पाथ के Web-INF/, तो आप उपयोग कर सकते हैं ContextLoaderListener


3

ContextLoaderListner एक सर्वलेट श्रोता है जो सभी विभिन्न कॉन्फ़िगरेशन फ़ाइलों (सर्विस लेयर कॉन्फ़िगरेशन, दृढ़ता परत कॉन्फ़िगरेशन आदि) को सिंगल स्प्रिंग एप्लिकेशन संदर्भ में लोड करता है।

यह कई XML फ़ाइलों में स्प्रिंग कॉन्फ़िगरेशन को विभाजित करने में मदद करता है।

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


3

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

इस श्रोता का दूसरा उपयोग तब होता है जब आप वसंत सुरक्षा का उपयोग करना चाहते हैं।


3

आगे पढ़ने से पहले रूट और बाल संदर्भ, कृपया समझते हैं कि -

वसंत में एक समय में कई संदर्भ हो सकते हैं। उनमें से एक रूट संदर्भ होगा, और अन्य सभी संदर्भ बाल संदर्भ होंगे।

सभी बाल संदर्भ जड़ संदर्भ में परिभाषित सेम तक पहुंच सकते हैं; लेकिन इसके विपरीत सच नहीं है। रूट संदर्भ बाल संदर्भ सेम तक नहीं पहुंच सकता है।

ApplicationContext:

ApplicationContext.xml हर वेब एप्लिकेशन के लिए रूट संदर्भ कॉन्फ़िगरेशन है। स्प्रिंग एप्लिकेशन को कोन्टेक्स्ट.क्सएमएल लोड करता है और पूरे अनुप्रयोग के लिए ApplicationContext बनाता है। प्रति वेब एप्लिकेशन पर केवल एक आवेदन संदर्भ होगा। यदि आप स्पष्ट रूप से web.xml में संदर्भ कॉन्फ़िगरेशन फ़ाइल नाम का संदर्भ नहीं दे रहे हैं, तो संदर्भकॉन्फ़्लिक्टेशन परम का उपयोग करते हुए, स्प्रिंग WEB-INF फ़ोल्डर के तहत ApplicationContext.xml की खोज करेगा और यदि यह फ़ाइल नहीं मिली तो FileNotFoundVception को फेंक दें।

ContextLoaderListener रूट अनुप्रयोग संदर्भ के लिए वास्तविक आरंभीकरण कार्य करता है। एक "ReferenceConfigLocation" संदर्भ-परम को पढ़ता है और इसके उदाहरण को संदर्भ उदाहरण में देता है, इसे संभावित रूप से कई फ़ाइल पथों में पार्स करता है, जिसे किसी भी संख्या में अल्पविराम और रिक्त स्थान द्वारा अलग किया जा सकता है, जैसे "WEB-INF / application.ontext1.xml, WEB-INF / applicationContext2.xml "। ContextLoaderListener वैकल्पिक है। बस यहाँ एक बिंदु बनाने के लिए: आप कभी भी ContextLoaderListener को कॉन्फ़िगर किए बिना एक स्प्रिंग एप्लिकेशन को बूट कर सकते हैं, डिस्पैसरसेर्वलेट के साथ बस एक मूल न्यूनतम web.xml।

DispatcherServlet DispatcherServlet अनिवार्य रूप से एक सर्वलेट है (यह HttpServlet को विस्तारित करता है) जिसका प्राथमिक उद्देश्य कॉन्फ़िगर किए गए URL पैटर्न से मेल खाते आने वाले वेब अनुरोधों को संभालना है। यह एक आने वाली यूआरआई लेता है और नियंत्रक और दृश्य का सही संयोजन पाता है। तो यह सामने नियंत्रक है।

जब आप स्प्रिंग कॉन्फ़िगरेशन में एक डिस्पैसरसर्वलेट को परिभाषित करते हैं, तो आप रेफ़रेंस वर्ग की प्रविष्टियों के साथ एक्सएमएल फ़ाइल प्रदान करते हैं, संदर्भकॉन्फ़्लेक्शन विशेषता का उपयोग करके मैपिंग आदि को देखते हैं।

WebApplicationContext ApplicationContext के अलावा, एक ही वेब एप्लिकेशन में कई WebApplicationContext हो सकते हैं। सरल शब्दों में, प्रत्येक DispatcherServlet एकल WebApplicationContext के साथ जुड़ा हुआ है। xxx-servlet.xml फ़ाइल DispatcherServlet के लिए विशिष्ट है और एक वेब अनुप्रयोग में अनुरोधों को संभालने के लिए एक से अधिक DispatcherServlet कॉन्फ़िगर हो सकते हैं। ऐसे परिदृश्यों में, प्रत्येक डिस्पैचरवार्लेट में एक अलग xxx-servlet.xml कॉन्फ़िगर किया गया होगा। लेकिन, सभी servlet कॉन्फ़िगरेशन फ़ाइलों के लिए ApplicationContext.xml आम होगा। स्प्रिंग आपके वेबऐप्स WEB-INF फोल्डर से “xxx-servlet.xml” नाम की डिफॉल्ट लोड फाइल करेगा, जहां xxx web.xml में सर्वलेट नाम है। यदि आप उस फ़ाइल का नाम बदलना चाहते हैं या स्थान बदलना चाहते हैं, तो संदर्भ नाम के साथ संदर्भ के रूप में दीक्षा-परम जोड़ें।

उनके बीच तुलना और संबंध:

ContextLoaderListener vs DispatcherServlet

ContextLoaderListener रूट एप्लिकेशन संदर्भ बनाता है। DispatcherServlet प्रविष्टियाँ एक बच्चा अनुप्रयोग संदर्भ प्रति सर्वलेट प्रविष्टि बनाती हैं। बाल संदर्भ जड़ संदर्भ में परिभाषित बीन्स तक पहुंच सकते हैं। बाल संदर्भों में बीन्स बाल संदर्भों (सीधे) में सेम तक नहीं पहुंच सकते हैं। सभी संदर्भों को ServletContext में जोड़ा जाता है। आप WebApplicationContextUtils वर्ग का उपयोग करके रूट संदर्भ तक पहुँच सकते हैं।

वसंत प्रलेखन पढ़ने के बाद, निम्नलिखित समझ है:

a) एप्लिकेशन-कॉन्टेक्ट्स पदानुक्रम हैं और इसलिए WebApplicationContexts हैं। यहाँ प्रलेखन देखें।

b) ContextLoaderListener वेब-एप्लिकेशन के लिए एक रूट वेब-एप्लिकेशन-संदर्भ बनाता है और इसे ServletContext में डालता है। इस संदर्भ का उपयोग स्प्रिंग-प्रबंधित बीन्स को लोड-अनलोड करने के लिए किया जा सकता है, जो इस बात से संबंधित है कि नियंत्रक परत (स्ट्रट्स या स्प्रिंग एमवीसी) में किस तकनीक का उपयोग किया जा रहा है।

c) DispatcherServlet अपना खुद का WebApplicationContext बनाता है और हैंडलर / कंट्रोलर / व्यू-रिसॉल्वर इस संदर्भ द्वारा प्रबंधित किए जाते हैं।

d) जब ContextLoaderListener को DispatcherServlet के साथ मिलकर उपयोग किया जाता है, तो एक रूट वेब-एप्लिकेशन-संदर्भ पहले कहा गया है और DispatcherSerlvet द्वारा एक बाल-संदर्भ भी बनाया जाता है और रूट एप्लिकेशन-संदर्भ से जुड़ा होता है। यहाँ प्रलेखन देखें।

जब हम स्प्रिंग एमवीसी के साथ काम कर रहे हैं और सेवाओं की परत में स्प्रिंग का उपयोग कर रहे हैं, तो हम दो एप्लिकेशन-संदर्भ प्रदान करते हैं। पहले एक को कॉन्टेक्स्टालैडरलिस्टनर और दूसरे को डिस्पैचरसर्वलेट के साथ कॉन्फ़िगर किया गया है

आम तौर पर, आप डिस्पैचरसर्वलेट संदर्भ में सभी एमवीसी संबंधित बीन्स (नियंत्रक और विचार आदि) को परिभाषित करेंगे, और सभी क्रॉस-कटिंग बीन्स जैसे कि सुरक्षा, लेन-देन, सेवाओं आदि को संदर्भ के संदर्भ में कॉन्टेक्स्टालैडरलिस्टनर द्वारा।

अधिक जानकारी के लिए इसे देखें: https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html


2

मूल रूप से आप ContextLoaderListner का उपयोग करके अपने रूट एप्लिकेशन संदर्भ और वेब एप्लिकेशन संदर्भ को अलग कर सकते हैं।

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

किसी भी वेब एप्लिकेशन में हमारे पास एक से अधिक डिस्पैचर सर्वलेट्स हो सकते हैं, इसलिए कई वेब एप्लिकेशन संदर्भ।

लेकिन किसी भी वेब एप्लिकेशन में हमारे पास केवल एक रूट एप्लिकेशन संदर्भ हो सकता है जो सभी वेब एप्लिकेशन संदर्भों के साथ साझा किया गया हो।

हमें अपनी सामान्य सेवाओं, संस्थाओं, पहलुओं आदि को रूट एप्लीकेशन के संदर्भ में परिभाषित करना चाहिए। और नियंत्रक, इंटरसेप्टर आदि प्रासंगिक वेब अनुप्रयोग संदर्भ में हैं।

एक नमूना web.xml है

<!-- language: xml -->
<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>example.config.AppConfig</param-value>
    </context-param>
    <servlet>
        <servlet-name>restEntryPoint</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.RestConfig</param-value>
        </init-param>       
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>restEntryPoint</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>webEntryPoint</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.WebConfig</param-value>
        </init-param>       
        <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet-mapping>
        <servlet-name>webEntryPoint</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app> 

यहाँ config class example.config.AppConfig का उपयोग सेवाओं, संस्थाओं, पहलुओं आदि को रूट एप्लिकेशन संदर्भ में कॉन्फ़िगर करने के लिए किया जा सकता है, जो अन्य सभी वेब एप्लिकेशन संदर्भों के साथ साझा किया जाएगा (उदाहरण के लिए हमारे पास दो वेब एप्लिकेशन संदर्भ कॉन्फ़िगरेशन कक्षाएं RestConfig और WebConfig हैं)

पुनश्च: यहां ContextLoaderListener पूरी तरह से वैकल्पिक है। अगर हम web.xml में ContextLoaderListener का उल्लेख नहीं करेंगे, तो AppConfig काम नहीं करेगा। उस स्थिति में हमें WebConfig और Rest कॉन्फ़िग में अपनी सभी सेवाओं और संस्थाओं को कॉन्फ़िगर करने की आवश्यकता है।


1

यह आपको कुछ कोड डालने के लिए हुक की बात देगा, जिसे आप वेब एप्लिकेशन पर लागू होने के समय निष्पादित करना चाहते हैं


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

संपत्तियों / xml फ़ाइलों को बदलना और उन्हें सर्वर को फिर से शुरू किए बिना रन टाइम पर फिर से लोड करना है
vsingh

1

श्रोता वर्ग - एक घटना पर उदाहरण (उदाहरण .. सर्वर स्टार्टअप / शटडाउन)

संदर्भ -

  1. सर्वर स्टार्ट / शटडाउन के दौरान सुनता है
  2. स्प्रिंग कॉन्फ़िगरेशन फ़ाइलों को इनपुट के रूप में लेता है और कॉन्फ़िगरेशन के अनुसार बीन्स बनाता है और इसे तैयार करता है (शटडाउन के दौरान बीन को नष्ट कर देता है)
  3. विन्यास फाइल इस तरह प्रदान की जा सकती है web.xml

    <param-name>contextConfigLocation</param-name>  
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>  

1

के वसंत ढांचे उद्देश्य के संदर्भ में ContextLoaderListener इस तरह के मध्य स्तरीय और डेटा स्तरीय घटक है कि आवेदन के पिछले सिरे पर ड्राइव के रूप में अपने आवेदन में अन्य सेम लोड करने के लिए है।


0

आपकी समझ सही है। मुझे आश्चर्य है कि क्यों आप ContextLoaderListener में कोई लाभ नहीं देखते हैं। उदाहरण के लिए, आपको एक सत्र कारखाना (डेटाबेस का प्रबंधन करने के लिए) बनाने की आवश्यकता है। इस ऑपरेशन में कुछ समय लग सकता है, इसलिए इसे स्टार्टअप पर करना बेहतर है। बेशक आप इसे इनलेट सर्वलेट्स या कुछ और के साथ कर सकते हैं, लेकिन स्प्रिंग के दृष्टिकोण का लाभ यह है कि आप बिना कोड लिखे कॉन्फ़िगरेशन कर सकते हैं।


0

अगर हम ContextLoaderListener के बिना web.xml लिखते हैं तो हम वसंत सुरक्षा में कस्टमअथेंटिकेशनप्रोवीडर का उपयोग करके एथेन्यूशन दे सकते हैं। क्योंकि DispatcherServelet ContextLoaderListener का बच्चा संदर्भ है, customAuthenticationProvider पेरेंटकोटेक्स्ट का हिस्सा है जो ContextLoaderListener है। इसलिए माता-पिता के संदर्भ में बच्चे के संदर्भ की निर्भरता नहीं हो सकती है। और इसलिए वसंत ऋतु-संदर्भ लिखने का सबसे अच्छा अभ्यास है। संदर्भ में इसे संदर्भ में लिखने के बजाय संदर्भ में लिखें।


0

मेरा मानना ​​है कि इसका वास्तविक उपयोग तब होता है जब आप एक से अधिक कॉन्फिग फाइल्स रखना चाहते हैं या आपके पास उदाहरण के लिए applicationcontext.xml के बजाय xyz.xml फाइल है।

<context-param><param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/training-service.xml, /WEB-INF/training-data.xml</param-value> </context-param>

ContextLoaderListener के लिए एक और दृष्टिकोण नीचे की तरह ContextLoaderServlet का उपयोग कर रहा है

<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

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