2011-06-08 16 views
14

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

उत्तर

22

यह जांचने के लिए कि आप किस माहौल में चल रहे हैं, यह जांचने के लिए अपने कोड में तर्क न जोड़ें - यह आपदा के लिए एक नुस्खा है (या कम से कम आधी रात के मध्य में सड़क को जलाना)।

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

public class ServiceFacade { 
    private String endpoint; 

    public void setEndpoint(String endpoint) { 
     this.endpoint = endpoint; 
    } 

    public void doStuffWithWebService() { 
     // use the value of endpoint to construct client 
    } 
} 

इसके बाद, का उपयोग वसंत के PropertyPlaceholderConfigurer (या वैकल्पिक रूप PropertyOverrideConfigurer) या तो एक .properties फ़ाइल से इस संपत्ति को भरने के लिए, या इसलिए तरह एक JVM प्रणाली संपत्ति से:

<bean id="serviceFacade" class="ServiceFacade"> 
    <property name="endpoint" value="${env.endpoint}"/> 
</bean> 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:environment.properties</value> 
    </property> 
</bean> 

अब दो (या तीन, या चार) फ़ाइलें इसलिए की तरह बना सकते हैं - विभिन्न वातावरण से प्रत्येक के लिए एक।

environment-dev.properties में:

env.endpoint=http://dev-server:8080/ 

environment-test.properties में:

env.endpoint=http://test-server:8080/ 

अब उचित गुण प्रत्येक परिवेश के लिए फाइल ले, नाम बदलने यह सिर्फ environment.properties को, और इसे अपने ऐप सर्वर की lib निर्देशिका या कहीं और कॉपी करें जहां यह आपके ऐप के क्लासपाथ पर दिखाई देगा। जैसे बिलाव के लिए:

cp environment-dev.properties $CATALINA_HOME/lib/environment.properties 

फिर से अपनी एप्लिकेशन को तैनात - स्प्रिंग मूल्य "http: // देव-सर्वर: 8080 /" विकल्प होगा जब यह क्रम पर अपने अंतिम बिंदु संपत्ति सेट करता है।

संपत्ति मूल्यों को लोड करने के तरीके के बारे में अधिक जानकारी के लिए स्प्रिंग दस्तावेज़ देखें।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। उदाहरण जिसका आपने उपयोग किया था वह वह है जिसे मैं काम कर रहा हूं। मैं जो कर रहा हूं वह है, एक वर्ग बनाया, जिसमें कन्स्ट्रक्टर पैरामीटर एंडपॉइंट और क्लाइंट प्रॉक्सी है। Appcontext.xml में, मानचित्र के आधार पर, पर्यावरण के आधार पर एंडपॉइंट पास करें, जैसे <प्रविष्टि कुंजी = "dev" value = "endpoint1" /><प्रविष्टि कुंजी = "prod" value = "2"/> Ritesh

+0

क्या मेरा दृष्टिकोण सही है? – Ritesh

+0

काफी नहीं; कृपया अद्यतन उत्तर देखें। – Pavel

0

हम इसे हमारे आवेदन में करते हैं लेकिन बसंत कॉन्फ़िगरेशन के भीतर नहीं करते हैं।

ऐप स्टार्टअप के दौरान (एक संदर्भ श्रोता में) हम मशीन के होस्टनाम को पढ़ते हैं और एक स्थिर चर में मिलान प्रोड, देव, क्यूए जानकारी संग्रहीत करते हैं।

हम सीधे वैरिएबल तक नहीं पहुंचते हैं (हालांकि कोई भी कर सकता है) लेकिन हमारे पास एक वसंत सेवा है जो हमें उस सर्वर के साथ इंटरफेस करती है ताकि हम अपने सर्वर पर्यावरण की जानकारी तक पहुंच सकें।

0

एक तरीका System.getProperty(key) विधि को देखना होगा, जो शुद्ध जावा है। हालांकि, यह शायद एक अच्छा विचार नहीं है क्योंकि आपको वास्तव में अपने आवेदन में इस तरह के पर्यावरण तर्क नहीं करना चाहिए।

एक और तरीका सर्वर कॉन्फ़िगरेशन होगा (प्रत्येक पर्यावरण के सर्वर के लिए एक अलग अनुप्रयोग संदर्भ फ़ाइल कॉन्फ़िगर करें)।

वसंत 3.1 इस तरह की चीज को 'परिवर्तनीय' फ़ाइलों के साथ 'ठीक से' करने के लिए नए तरीकों को भी ला रहा है। आपको unified property management blog पर एक नज़र डालना चाहिए। m1 release announcement में और जानकारी है।

10

यह ध्यान देने योग्य है कि Spring 3.1 M1 introduced profiles support।जो शायद इस आवश्यकता का अंतिम जवाब होगा। तो इसके लिए एक नजर रखें।

इस बीच, मैं व्यक्तिगत रूप से वैसे ही करता हूं जो पावेल ने वर्णन किया था।

संबंधित मुद्दे