2012-11-21 39 views
9

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

@Value("#{${env} == "production" ? realService : dummyService}") 
    private SomeService service; 

... जो काम करना चाहिए, लेकिन अच्छा नहीं:

कल मैं वसंत टिप्पणी के साथ एक समाधान पता लगा।

मुझे आपके समाधान, या तर्कों के लिए बहुत दिलचस्पी होगी: यह वास्तविक समस्या क्यों नहीं है ;-) गुइस, वसंत, या किसी अन्य का स्वागत है।

मूल मुद्दा इस धागे का एक हिस्सा था: Spring @Autowired usage, लेकिन मैंने सोचा कि इसे बनाने के लिए एक नया धागा लायक है।

उत्तर

9

दुर्भाग्य से मैं गुइस पर टिप्पणी नहीं कर सकता, लेकिन टिप्पणियों में उल्लिखित अनुसार आप वास्तव में स्प्रिंग प्रोफाइल का उपयोग कर सकते हैं - यदि आप स्प्रिंग 3.1 या बाद में इसका उपयोग कर रहे हैं।

एक जावा आधारित विन्यास प्रोफाइल का उपयोग कर कुछ दिखाई दे सकता है जैसे:

@Configuration 
@Profile("production") 
public class ProductionConfig { 
    @Bean 
    public SomeService someService() { ... } 
} 

@Configuration 
@Profile("dev") 
public class DevelopmentConfig { 
    @Bean 
    public SomeService someService() { ... } 
} 

फिर अपने उपभोक्ता वर्ग तो सरल हो जाता है फिर से:

... 
@Autowired 
private SomeService someService; 
... 

इच्छित प्रोफ़ाइल, अन्य तरीकों के बीच, के माध्यम से सक्रिय किया जा सकता एक सिस्टम प्रॉपर्टी:

-Dspring.profiles.active="production" 

जो उपयोगी हो सकता है जब उपयोगी हो सकता है विभिन्न वातावरण में अपना आवेदन चला रहा है।

व्यक्तिगत रूप से मैं स्प्रिंग प्रोफाइल पर भरोसा नहीं करने की कोशिश करता हूं। इसके बजाय मैं बाहरी संपत्ति फ़ाइलों में पर्यावरणीय मतभेदों को आज़माता हूं और इन्हें रनटाइम पर एप्लिकेशन में पास कर देता हूं। इस दृष्टिकोण ने अभी तक अच्छी तरह से काम किया है लेकिन ymmv।

-1

@Value एनोटेशन आपके द्वारा किए गए तरीके से काम नहीं करता है। यह आपको केवल स्ट्रिंग के रूप में मूल्य दे सकता है। जो आप प्राप्त करना चाहते हैं उसके लिए आप स्प्रिंग प्रोफाइल का प्रयास कर सकते हैं जैसा कि @ShyJ द्वारा सुझाया गया है।

उम्मीद है कि यह आपकी मदद करता है। चीयर्स।

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

  • कोई संबंधित समस्या नहीं^_^