2009-05-23 8 views
13

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

सर्विसलोडर आपको किसी दिए गए प्रकार के लिए सेवा के रूप में परिभाषित सभी कार्यान्वयन की एक सूची खींचने देता है।

import java.util.ServiceLoader; 

import com.google.inject.AbstractModule; 
import com.google.inject.Module; 

public class ModuleLoader<M extends Module> extends AbstractModule { 

    private final Class<M> type; 

    public ModuleLoader(Class<M> type) { 
     this.type = type; 
    } 

    public static <M extends Module> ModuleLoader<M> of(Class<M> type) { 
     return new ModuleLoader<M>(type); 
    } 

    @Override 
    protected void configure() { 
     ServiceLoader<M> modules = ServiceLoader.load(type); 
     for (Module module : modules) { 
      install(module); 
     } 
    } 
} 

प्रयोग उदाहरण (क guice-सर्वलेट परियोजना में एक गतिशील सर्वलेट लोडर के रूप में): Guice के साथ मिलकर इस लाना, आप के साथ अंत

import com.google.inject.servlet.ServletModule; 

public class ServletLoader extends GuiceServletContextListener { 
    @Override 
    protected final Injector getInjector() { 
     return Guice.createInjector(ModuleLoader.of(ServletModule.class); 
    } 
} 

सेवाएं (मॉड्यूल के रूप में पैक) होगा अलग जार फ़ाइलों में पैक किया गया। हर एक को आप मेटा डेटा में वर्ग (ते) निर्धारित करेंगे भीतर:

Within servlets.jar: META-INF/services/com.google.inject.Module 

com.example.webapps.MyServletModuleA 
com.example.webapps.MyServletModuleB 

जब से हम Maven का उपयोग, हमें लगता है के रूप में हम प्रोफ़ाइल निर्भरता के माध्यम से कार्यावधि में विभिन्न कार्यान्वयन में खींच सकता है यह आदर्श होगा। क्या कोई इस तरह गुइस का उपयोग कर रहा है?

यदि नहीं, तो इस उदाहरण का उपयोग करने में संकोच न करें और देखें कि यह आपके लिए कैसे काम करता है। (सर्विसलोडर केवल जेडीके 6 + में समर्थित है)

+0

क्या आप मदद कर सकते हैं? मैं कुछ ऐसा करने की कोशिश कर रहा हूं लेकिन सर्विसलोडर के साथ नोबॉई समस्या है? http://stackoverflow.com/questions/28983997/java-cant-get-a-working-serviceloader – tommed

उत्तर

3

हम लगभग मेरे काम पर यह बिल्कुल कर रहे हैं। हम वर्तमान में कुछ आंतरिक सीमाओं के कारण जावा 5 में फंस गए हैं, इसलिए हम सेवा प्रदाता का उपयोग करके थोड़ा अलग तरीके से करते हैं (आपके द्वारा वर्णित जावा 6 तक सेवा लोकेटर तक पहुंच न होने के कारण), लेकिन यह अनिवार्य रूप से वही काम करता है।

मुझे कहीं पढ़ना याद है कि यह गुइस डेवलपर्स की सिफारिश की जाने वाली पसंदीदा तरीकों में से एक था, हालांकि वे इसे लचीलापन के लिए खोलना चाहते हैं।

1

मैंने पहले से ही इस तरह से विचार किया लेकिन मैंने इसका उपयोग नहीं किया क्योंकि मुझे डर था, मुझे अपने मॉड्यूल को बहुत छोटा रखना है, क्योंकि यह एक ही इंटरफेस को दो बार बांधना असंभव है। मेरी समस्या यह है कि अगर मैं एक इंटरफ़ेस/कक्षा/enum/जो भी किसी अन्य जार से उपयोग करना चाहता हूं और उस जार ने एक सेवा/* फ़ाइल को परिभाषित किया है, तो मैं खराब हूं, क्योंकि मैं इसे बिना लोड किए जार की सामग्री का उपयोग नहीं कर सकता मॉड्यूल।

मुझे आशा है कि मेरी चिंता स्पष्ट है।

0

"क्योंकि एक ही इंटरफेस को दो बार बांधना असंभव है।"

यह वास्तव में गलत है! गुइस के मल्टीबिन्डर के साथ एक ही इंटरफ़ेस के विभिन्न कार्यान्वयन के साथ काम करने का एक तरीका है, संभवतः विभिन्न मॉड्यूल में बाध्य है।

मार्क रेनौफ (उसका मॉड्यूललोडर वास्तव में बेहतर दिखता है) की वास्तविक लोडिंग के लिए मैं थोड़ा अलग समाधान आया था, लेकिन मेरा ब्लॉग पोस्ट पर्यावरण के बारे में कुछ और दिखा सकता है जहां यह दृष्टिकोण लागू है (प्लगइन्स) और विस्तार क्या है अंक इस तरह दिखते हैं:

Guice 2.0 Multibinder + Java ServiceLoader = Plugin mechanism