2011-01-26 11 views
18

जावा में लिखित एक निगरानी सॉफ्टवेयर के लिए मैं Google Guice को DI प्रदाता के रूप में उपयोग करने पर विचार करता हूं। परियोजना को बाहरी संसाधन (फ़ाइल या डेटाबेस) से इसकी कॉन्फ़िगरेशन लोड करने की आवश्यकता है। एप्लिकेशन को स्टैंडअलोन मोड में या सर्वलेट कंटेनर में चलाने के लिए डिज़ाइन किया गया है।गुइस और सामान्य अनुप्रयोग कॉन्फ़िगरेशन

फिलहाल कॉन्फ़िगरेशन में निर्भरता इंजेक्शन के लिए बाइंडिंग या पैरामीटर नहीं होते हैं, केवल कुछ वैश्विक एप्लिकेशन सेटिंग्स (जेडीबीसी कनेक्शन परिभाषाएं और संबंधित डेटाबेस प्रबंधन/निगरानी ऑब्जेक्ट्स)। उदाहरण Apache Commons Configuration के लिए

  • एक और पुस्तकालय का उपयोग करने, है, जो फ़ाइल और JDBC विन्यास स्रोतों (और कई अन्य)

या

  • करने का समर्थन करता है:

    मैं दो विकल्प देखेंगे एप्लिकेशन विकल्पों को संग्रहीत करने के लिए guice-xml-config जैसे गुइस के लिए फ़ाइल आधारित एडन का उपयोग करें (यह बाद में DI भाग को कॉन्फ़िगर करने की अनुमति देगा यदि यह नीस हो जाता है sary)।

क्या आप दोनों कार्यों के लिए गुइस का उपयोग करने की सलाह देंगे, या सामान्य अनुप्रयोग कॉन्फ़िगरेशन निर्भरता इंजेक्शन से अलग रखें? आप सबसे महत्वपूर्ण कौन से फायदे और नुकसान पर विचार करेंगे?

उत्तर

29

यह एक Guice मॉड्यूल में एक संपत्ति फ़ाइल slurp करने के लिए सीधा है:

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
    try { 
     Properties properties = new Properties(); 
     properties.load(new FileReader("my.properties")); 
     Names.bindProperties(binder(), properties); 
    } catch (IOException ex) { 
     //... 
    } 
    } 
} 

बाद में यह अन्य config सूत्रों के गुण से स्विच करना आसान है।

[संपादित करें]

BTW, आप @Named("myKey") साथ यह व्याख्या द्वारा इंजेक्शन गुण प्राप्त कर सकते हैं।

+1

+1 मुझे लगता है कि आप भी उल्लेख करना चाहिए यद्यपि 'नामांकित' का उपयोग करके गुणों को इंजेक्शन दिया जाता है। – ColinD

1

मैं अपनी परियोजना में एक ही समस्या में भाग गया। हमने पहले से ही गिइस को डी-फ्रेमवर्क के रूप में चुना था और कॉन्फ़िगरेशन के साथ चीजों को सरल बनाने के लिए चीजों को सरल रखना था।

हमने Apache Commons Configuration का उपयोग करके गुण फ़ाइल से कॉन्फ़िगरेशन को पढ़ना समाप्त कर दिया है और गुइस अकसर किये गए सवाल How do I inject configuration parameters? में सुझाए गए गुइस इंजेक्टर को बाध्य कर दिया है।

@Override public void configure() { 
    bindConstant().annotatedWith(ConfigurationAnnotation.class) 
     .to(configuration.getString("configurationValue"));  
} 

कॉमन्स कॉन्फ़िगरेशन द्वारा समर्थित कॉन्फ़िगरेशन को पुनः लोड करना भी गिस इंजेक्शन में काफी आसान है।

@Override public void configure() { 
    bind(String.class).annotatedWith(ConfigurationAnnotation.class) 
     .toProvider(new Provider<String>() { 
      public String get() { 
       return configuration.getString("configurationValue"); 
      } 
    });  
} 
3

चेक governator पुस्तकालय:

https://github.com/Netflix/governator/wiki/Configuration-Mapping

आप एक @Configuration एनोटेशन और कई विन्यास प्रदाताओं मिल जाएगा।कोड में यह जहां है आप विन्यास पैरामीटर का उपयोग किया देखने के लिए मदद करता है:

@Configuration("configs.qty.things") 
private int numberOfThings = 10; 

इसके अलावा, आप स्टार्टअप पर एक अच्छा विन्यास रिपोर्ट मिल जाएगा:

https://github.com/Netflix/governator/wiki/Configuration-Mapping#configuration-documentation

3

Guice configuration Maven केंद्रीय पर उपलब्ध की कोशिश करें, यह समर्थन है गुण, होकॉन और जेएसओएन प्रारूप।

आप अपनी सेवा करने के लिए फ़ाइल application.conf से गुण इंजेक्षन के रूप में कर सकते हैं:

@BindConfig(value = "application") 
public class Service { 

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

    @InjectConfig("services") 
    private ServiceConfiguration services; 
} 

आप मॉड्यूल ConfigurationModule स्थापित करना होगा के रूप में

public class GuiceModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     install(ConfigurationModule.create()); 
     requestInjection(Service.class); 
    } 
}