java - Not loading a Spring bean when a certain profile is set -
पृष्ठभूमि: इसलिए, मेरे पास कई सेम हैं जो इंटरफ़ेस बाह्य सिस्टम हैं विकास के लिए, बाहरी प्रणालियों का मजाकिया करना आसान है और कुछ कार्यान्वयन वाले अंतरण पक्षियों को प्रतिस्थापित करना जो अधिक या कम स्थिर प्रतिक्रियाएं उत्पन्न करते हैं। तो मैं जो कर रहा हूं वह एक इंटरफ़ेस, वास्तविक कार्यान्वयन और इस तरह एक स्टब कार्यान्वयन करना है:
सार्वजनिक इंटरफेस बाहरी सेवा {// ...} @ सेवा सार्वजनिक वर्ग ExternalServiceImpl ExternalService लागू करता है {// ...} @ सेवा @ प्राथमिक @प्रफ़ाइल ({"stub"}) सार्वजनिक वर्ग StubExternalService लागू करता है ExternalService {// ...}
... और यह काम करता है महान : यदि स्टब प्रोफाइल मौजूद नहीं है, तो स्टब-बीन बिल्कुल भी लोड नहीं होता है। अगर यह मौजूद है, तो @ प्राथमिक भाषण के कारण यह अच्छी तरह से वास्तविक कार्यान्वयन को प्रतिस्थापित करता है।
समस्या: अब, हालांकि, मैंने पहली बार एक स्थिति में जहां मैं वास्तव में एक ही इंटरफ़ेस के दो वास्तविक कार्यान्वयन मिल गया है उनमें से एक को प्राथमिक के रूप में परिभाषित किया गया है, लेकिन दूसरे को भी इसका उपयोग एप्लिकेशन संदर्भ से लोड करके किया जा सकता है।
मैं उन दोनों को बदलने के लिए अभी भी एक स्टब सेवा बनाना चाहूंगा, लेकिन इस बार मेरे पुराने @ प्राथमिक के रूप में स्टब को परिभाषित करने का तरीका काम नहीं करता, क्योंकि पहले से ही एक प्राथमिक कार्यान्वयन है असल में मुझे क्या चाहिए था स्टब प्रोफ़ाइल सेट होने पर प्राथमिक बीन को लोड न करने का एक तरीका है, लेकिन मुझे यह नुकसान हुआ है कि ऐसा कैसे करना है। वेब खोजों या अन्य स्टैक ओवरफ़्लो प्रश्नों की मदद करना नहीं लगता है।
जवाब बाहर चला गया आश्चर्यजनक रूप से था सरल: आप प्रोफाइल नाम के सामने एक नॉन-ऑपरेटर (!
) जोड़ते हैं:
@ सेवा @ प्राथमिक @प्रफ़ाइल ({"! Stub"}) सार्वजनिक वर्ग ExternalServiceImpl लागू ExternalService {// ...}
इस तरह बीन केवल तब लोड होता है जब स्टब
-profile सक्रिय नहीं है इस सुविधा के लिए समर्थन जोड़ा गया था।
एक चेतावनी है, हालांकि: यदि आप @Profile ({"! Stub", "foo"}) लिखते हैं, तो कॉमा "या", नहीं "और" के रूप में माना जाता है तो इस उदाहरण बीन को सक्रिय किया जाएगा, यदि
स्टब सक्रिय नहीं था या अगर
foo
सक्रिय था।
Comments
Post a Comment