मेरे पास बैकएंड सेवा के डिफ़ॉल्ट निहितार्थ के साथ चल रहा वेब एप्लिकेशन है। एक इंटरफेस को कार्यान्वित करने और जार को प्लगइन्स फ़ोल्डर में छोड़ने में सक्षम होना चाहिए (जो ऐप्स क्लासपाथ में नहीं है)। एक बार सर्वर को पुनरारंभ करने के बाद, विचार है कि नया जार क्लासलोडर में लोड करना है, और यह निर्भरता इंजेक्शन में हिस्सा लेता है। मैं @Autowired का उपयोग कर स्प्रिंग डी का उपयोग कर रहा हूँ। नई प्लगइन सेवा प्रत्यारोपण @Primary एनोटेशन होगा। तो इंटरफेस के दो इम्प्ले दिए गए, प्राथमिक लोड किया जाना चाहिए।वसंत निर्भरता इंजेक्शन और प्लगइन जार
मुझे जार को क्लासलोडर में लोड किया गया है और मैन्युअल रूप से इम्प्लायर का आह्वान कर सकता है। लेकिन मैं निर्भरता इंजेक्शन में भाग लेने में सक्षम नहीं हूं, और इसे डिफ़ॉल्ट प्रत्यारोपण में बदल दिया है।
यहाँ एक सरल उदाहरण है:
@Controller
public class MyController {
@Autowired
Service service;
}
//default.jar
@Service
DefaultService implements Service {
public void print() {
System.out.println("printing DefaultService.print()");
}
}
//plugin.jar not in classpath yet
@Service
@Primary
MyNewService implements Service {
public void print() {
System.out.println("printing MyNewService.print()");
}
}
// बेहतर जगह की कमी के लिए, मैं ContextListener
public class PluginContextLoaderListener extends org.springframework.web.context.ContextLoaderListener {
@Override
protected void customizeContext(ServletContext servletContext,
ConfigurableWebApplicationContext wac) {
System.out.println("Init Plugin");
PluginManager pluginManager = PluginManagerFactory.createPluginManager("plugins");
pluginManager.init();
//Prints the MyNewService.print() method
Service service = (Service) pluginManager.getService("service");
service.print();
}
}
<listener>
<listener-class>com.plugin.PluginContextLoaderListener</listener-class>
</listener>
के बाद भी मैं classloader में जार लोड से प्लगइन जार भरी हुई, डिफ़ॉल्ट सेवा अभी भी सेवा के रूप में इंजेक्शन दी जा रही है। वसंत की डी लाइफसाइकिल में भाग लेने के लिए मुझे प्लगइन जार कैसे मिलता है?
संपादित: इसे बस रखने के लिए, मेरे पास एक युद्ध फ़ाइल है जिसमें युद्ध के अंदर प्लगइन निर्देशिका में कुछ प्लगइन जार हैं। ऐप चालू होने पर कॉन्फ़िगरेशन फ़ाइल से एक मान के आधार पर, मैं उस विशेष प्लगइन जार को लोड करना चाहता हूं और इसके साथ एप्लिकेशन चला सकता हूं। इस तरह, मैं किसी को भी युद्ध वितरित कर सकता हूं, और वे चुन सकते हैं कि कॉन्फ़िगरेशन मूल्य के आधार पर कौन सी प्लगइन चलाने के लिए सब कुछ दोबारा तैयार किया जा सकता है। यह समस्या है जिसे मैं हल करने की कोशिश कर रहा हूं।
धन्यवाद। ऐसा लगता है कि यह काम करेगा। लेकिन मैं वसंत एनोटेशन का भारी उपयोग कर रहा हूं, और प्लगइन जार में कोई वसंत xml नहीं है। मुझे आश्चर्य है कि एनोटेशन-संचालित निर्भरता इंजेक्शन के लिए उपर्युक्त करना उतना ही आसान होगा। – Langali
आपके प्रत्येक प्लगइन में कुछ प्रकार की कॉन्फ़िगरेशन होनी चाहिए (@ मेरा विस्तारित उत्तर देखें)। यहां तक कि यदि प्लगइन के पैकेज के केवल एक ही ' ' के साथ यह केवल एक छोटा एक्सएमएल है, तो यह ** ** प्लगइन ** और कहीं और नहीं होना चाहिए। यह प्लगइन है जो खुद को सर्वश्रेष्ठ जानता है और खुद को कॉन्फ़िगर करने के बारे में जानता है। कोर मॉड्यूल को प्लगइन्स अस्तित्व से अवगत नहीं होना चाहिए - इसे केवल उन्हें 'एप्लिकेशन कॉन्टेक्स्ट' में अपनी कॉन्फ़िगरेशन में शामिल होने की संभावना प्रदान करनी चाहिए। –
Roadrunner