स्प्रिंग के जावा कॉन्फिगरेशन का उपयोग करते हुए, मुझे कंस्ट्रक्टर तर्कों के साथ एक प्रोटोटाइप-स्कॉप्ड बीन का अधिग्रहण / त्वरित करने की आवश्यकता है जो केवल रनटाइम पर प्राप्य हैं। निम्नलिखित कोड उदाहरण पर विचार करें (संक्षिप्तता के लिए सरल):
@Autowired
private ApplicationContext appCtx;
public void onRequest(Request request) {
//request is already validated
String name = request.getParameter("name");
Thing thing = appCtx.getBean(Thing.class, name);
//System.out.println(thing.getName()); //prints name
}
जहाँ थिंग क्लास को इस प्रकार परिभाषित किया गया है:
public class Thing {
private final String name;
@Autowired
private SomeComponent someComponent;
@Autowired
private AnotherComponent anotherComponent;
public Thing(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
सूचना name
है final
: यह केवल एक निर्माता के माध्यम से आपूर्ति की जा सकती है, और अपरिवर्तनीयता की गारंटी देता है। अन्य निर्भरताएं Thing
वर्ग के कार्यान्वयन-विशिष्ट निर्भरताएं हैं , और अनुरोध हैंडलर कार्यान्वयन के लिए (कसकर युग्मित) ज्ञात नहीं होना चाहिए।
यह कोड स्प्रिंग एक्सएमएल विन्यास के साथ पूरी तरह से अच्छी तरह से काम करता है, उदाहरण के लिए:
<bean id="thing", class="com.whatever.Thing" scope="prototype">
<!-- other post-instantiation properties omitted -->
</bean>
मैं जावा कॉन्फिग के साथ एक ही चीज कैसे प्राप्त करूं? निम्नलिखित स्प्रिंग 3.x का उपयोग करके काम नहीं करता है:
@Bean
@Scope("prototype")
public Thing thing(String name) {
return new Thing(name);
}
अब, मैं एक कारखाना बना सकता हूँ , जैसे:
public interface ThingFactory {
public Thing createThing(String name);
}
लेकिन सेवाप्रचालक और फैक्टरी डिजाइन पैटर्न को बदलने के लिए स्प्रिंग का उपयोग करने के पूरे बिंदु को हरा देता है , जो इस उपयोग के मामले के लिए आदर्श होगा।
यदि स्प्रिंग जावा कॉन्फिगर ऐसा कर सकता है, तो मैं इससे बच सकूंगा:
- फ़ैक्टरी इंटरफ़ेस को परिभाषित करना
- फैक्टरी कार्यान्वयन को परिभाषित करना
- फैक्टरी कार्यान्वयन के लिए परीक्षण लेखन
यह एक टन का काम है (अपेक्षाकृत बोलने वाला) कुछ इतना तुच्छ के लिए कि वसंत पहले से ही एक्सएमएल विन्यास के माध्यम से समर्थन करता है।
Thing
कार्यान्वयन वास्तव में अधिक जटिल है और अन्य सेम पर निर्भरता है (मैं सिर्फ उन्हें संक्षिप्तता के लिए छोड़ दिया है)। जैसे कि, मैं उनके बारे में जानने के लिए अनुरोध हैंडलर कार्यान्वयन नहीं चाहता, क्योंकि यह हैंडलर को एपीआई / सेम के लिए कसकर जोड़ेगा। मैं आपके (उत्कृष्ट) प्रश्न को प्रतिबिंबित करने के लिए प्रश्न को अपडेट करूंगा।
@Qualifier
पैरामीटर पर एक सेट्टर के साथ @Autowired
ही सेटटर पर रख सकते हैं ।
@Bean
काम के साथ आपका उदाहरण । @Bean
विधि उचित तर्क आप के लिए पारित के साथ बुलाया जाता है getBean(..)
।