java - ContextLoaderListener या नहीं?




spring servlets dependency-injection (4)

आपके मामले में, नहीं, ContextLoaderListener और applicationContext.xml को रखने का कोई कारण नहीं है। यदि आपका ऐप केवल सर्वलेट के संदर्भ के साथ ठीक काम करता है, तो उसके साथ चिपक जाता है, यह आसान है।

हां, आम तौर पर प्रोत्साहित पैटर्न वेब-स्तरीय संदर्भ में गैर-वेब सामग्री रखना है, लेकिन यह एक कमजोर सम्मेलन से अधिक कुछ नहीं है।

वेबएप-स्तरीय संदर्भ का उपयोग करने के लिए केवल एकमात्र आकर्षक कारण हैं:

  • यदि आपके पास एकाधिक DispatcherServlet जो सेवाओं को साझा करने की आवश्यकता है
  • यदि आपके पास विरासत / गैर स्प्रिंग सर्लेट हैं जिन्हें स्प्रिंग-वायर्ड सेवाओं तक पहुंच की आवश्यकता है
  • यदि आपके पास सर्वलेट फ़िल्टर हैं जो OpenEntityManagerInViewFilter -स्तरीय संदर्भ में हुक करते हैं (जैसे स्प्रिंग सिक्योरिटी OpenEntityManagerInViewFilter , OpenEntityManagerInViewFilter , आदि)

इनमें से कोई भी आप पर लागू नहीं होता है, इसलिए अतिरिक्त जटिलता अनचाहे है।

सर्वलेट के संदर्भ, जैसे शेड्यूल किए गए कार्यों, जेएमएस कनेक्शन इत्यादि में पृष्ठभूमि कार्यों को जोड़ते समय सावधान रहें। यदि आप अपने web.xml <load-on-startup> जोड़ना भूल जाते हैं, तो ये कार्य पहले तक शुरू नहीं होंगे सर्वलेट की पहुंच।

एक मानक वसंत वेब एप्लिकेशन (रू या "स्प्रिंग एमवीसी प्रोजेक्ट" टेम्पलेट द्वारा बनाया गया) ContextLoaderListener और DispatcherServlet साथ एक web.xml बनाते हैं। वे न केवल DispatcherServlet उपयोग करते हैं और इसे पूर्ण कॉन्फ़िगरेशन लोड करने के लिए क्यों करते हैं?

मैं समझता हूं कि ContextLoaderListener का उपयोग ऐसी सामग्री को लोड करने के लिए किया जाना चाहिए जो वेब प्रासंगिक नहीं है और DispatcherServlet का उपयोग वेब प्रासंगिक सामग्री (नियंत्रक, ...) को लोड करने के लिए किया जाता है। और इसके परिणामस्वरूप दो संदर्भ होते हैं: एक अभिभावक और एक बाल संदर्भ।

पृष्ठभूमि:

मैं इसे कई वर्षों तक इस मानक तरीके से कर रहा था।

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Handles Spring requests -->
<servlet>
    <servlet-name>roo</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

इससे अक्सर दो संदर्भों और उनके बीच निर्भरताओं के साथ समस्याएं उत्पन्न हुईं। अतीत में मैं हमेशा एक समाधान खोजने में सक्षम था, और मुझे मजबूत भावना है कि यह सॉफ्टवेयर संरचना / वास्तुकला हमेशा बेहतर बनाता है। लेकिन अब मुझे दोनों संदर्भों की घटनाओं के साथ एक समस्या का सामना करना पड़ रहा है

- हालांकि यह मेरे दो संदर्भ पैटर्न पर पुनर्विचार करता है, और मैं खुद से पूछ रहा हूं: मुझे खुद को इस समस्या में क्यों लाया जाना चाहिए, क्यों नहीं सभी वसंत विन्यास फाइलों को एक DispatcherServlet साथ लोड करना और ContextLoaderListener पूरी तरह से हटा देना। (मुझे अभी भी अलग-अलग विन्यास फाइलें होंगी, लेकिन केवल एक संदर्भ होगा।)

ContextLoaderListener को हटाने का कोई कारण नहीं है?


आप आवेदन संदर्भ को अन्य तरीकों से भी कॉन्फ़िगर कर सकते हैं। जैसे OpenEntityManagerInViewFilter काम करने के लिए। ContextLoaderListener को सेटअप करें और उसके बाद अपने डिस्पैचर सर्वर को कॉन्फ़िगर करें:

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
</servlet>

बस सुनिश्चित करें कि संदर्भ कॉन्फ़िगर स्थान पैरामीटर मान खाली है।


मैं अपने स्प्रिंग-एमवीसी अनुप्रयोग पर जो कुछ किया है उसे साझा करना चाहता हूं:

  1. we-mvc-config.xml मैंने केवल @ नियंत्रक के साथ एनोटेटेड कक्षाएं जोड़े:

    <context:component-scan base-package="com.shunra.vcat">
        <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
    </context:component-scan>
    
  2. ApplicationContext.xml फ़ाइलों पर मैंने बाकी सभी को जोड़ा:

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

Object.hashcode () एक देशी विधि है।

public native int hashCode();

इसका मतलब है कि यह प्लेटफ़ॉर्म विशिष्ट कोड में लागू किया गया है और इसे मूल विधि के रूप में उजागर किया गया है।

समान कोड एक संकलित कोड होगा और JDK के साथ उपलब्ध नहीं होगा

यह मौजूदा प्रश्न अधिक जानकारी प्रदान कर सकता है।





java spring servlets dependency-injection