2010-09-29 16 views
7

मैं एक पुस्तकालय बना रहा हूं जिसे एक जार के रूप में शामिल किया जाएगा, इसलिए इसमें मुख्य विधि नहीं होगी। मैं सोच रहा हूं कि इस मामले में गुइसे बूट करने के लिए सबसे अच्छा अभ्यास क्या है। मेरे पास एक शीर्ष स्तर सिंगलटन है।मुख्य विधि के बिना गुइस का उपयोग

public class TestManager 
{ 
    private TestManager() 
    { 
    } 

    public static TestManager getInstance() 
    { 
     // construct and return singleton 
    } 

    public void createSomeObjects() 
    { 
    } 

} 

मुझे गुइसे को बूटस्ट्रैप कहां रखना चाहिए? मैं सोच रहा था कि कन्स्ट्रक्टर में मैं Guice.createInjector (नया मॉड्यूल()) कह सकता हूं; लेकिन यह SomeObjects() बनाने में बनाई गई किसी भी वस्तु को इंजेक्ट नहीं करेगा।

क्या आपके पास कोई मुख्य तरीका नहीं है जब आपके पास मुख्य विधि() नहीं है?

चीयर्स।

उत्तर

8

लॉगिंग विन्यास की तरह, अगर यह एक सच पुस्तकालय है तो अपने विकल्पों को काफी इस प्रकार हैं:

  • पुस्तकालय उपयोगकर्ता है कि वे बूटस्ट्रैपिंग Guice खुद के लिए जिम्मेदार हैं बताओ।
  • एक पुस्तकालय प्रारंभ विधि कि बूटस्ट्रैपिंग Guice का ख्याल रखता है कि वे अपने पुस्तकालय

उपयोग करने के लिए पुस्तकालय सुपर स्मार्ट आत्म विन्यास करने के लिए बनाने के लिए कोशिश कर रहा है चाहते हैं, तो प्रदान करें अक्सर कुछ हद तक अनम्य साथ समाप्त होता है, हार्ड वर्ग पदानुक्रमों का परीक्षण करने के लिए।

अपने पुस्तकालय में महत्वपूर्ण वर्गों का विस्तार या अन्यथा एक वर्ग है कि एक स्थिर ब्लॉक में सब कुछ initializes संदर्भ करते हैं:

+5

अपने ग्राहकों को एक गिवाइस मॉड्यूल देना अच्छी तरह से काम कर सकता है। सुपर-स्मार्ट स्व-कॉन्फ़िगरेशन के लिए –

+1

+1। बस अपाचे कॉमन्स लॉगिंग के साथ कितना बुरा हुआ यह सोचें। –

+0

@ जेसे, मैंने पुस्तकालयों को कभी नहीं देखा है जो कि गुइस का आंतरिक रूप से उपयोग करते हैं, वास्तव में अंत उपयोगकर्ताओं को इसका पर्दाफाश करते हैं। उदाहरण Maven और JIRA के लिए पर्दे के पीछे आईओसी का उपयोग लेकिन वे आपको यह जानकर कि किस कार्यान्वयन वे उपयोग के बिना अपने वर्गों में इंजेक्षन। उजागर Guice क्लीनर लगता है (उपयोगकर्ता Guice के साथ सहज है) लेकिन मुझे डर है कि यह उन दूर डराने सकता हूँ (किसी और कारण है कि और कोई नहीं यह क्या करता है?)। – Gili

0

यह है कि तुम क्या करते हैं, लेकिन क्या आप करते सकता है चाहिए नहीं है। यह एक बहुत गंदे हैक है, लेकिन यदि आप सुनिश्चित करते हैं कि आपके एपीआई को क्लासलोडर के बिना आपके प्रारंभिक श्रेणी को लोड करने के बिना एक्सेस नहीं किया जा सकता है तो आपको सुरक्षित पक्ष पर होना चाहिए।

यदि आप AspectJ का उपयोग करते हैं तो आप इसे थोड़ा क्लीनर बना सकते हैं और प्रारंभिक प्रकार के प्रारंभिक प्रकार को अपनी लाइब्रेरी में सभी कक्षाओं में (जावा कोड को छूए बिना) इंजेक्शन दिया है, लेकिन यह अभी भी एक हैक होगा।

0

तुम सिर्फ पूरे आवेदन अपने पुस्तकालय के दायरे में और के लिए नहीं Guice का उपयोग कर रहे हैं तो आप TestManager कक्षा में एक स्थिर ब्लॉक इस्तेमाल कर सकते हैं।

इस रणनीति मानता है कि आवेदन कुछ बिंदु पर TestManager.getInstance() कॉल करने के लिए जा रहा है और यह अपने एपीआई में केवल प्रवेश बिंदु है कि है।

@Singleton 
class TestManager { 

    private static final TestManager INSTANCE; 

    static { 
    INSTANCE = Guice.createInjector(new Module()).getInstance(TestManager.class); 
    } 

    private TestManager() { 
    } 

    public static TestManager getInstance() { 
     return INSTANCE; 
    } 

    @Inject 
    public void createSomeObjects(YourDependencies ...) { 
    // Do something with dependencies 
    } 
} 
संबंधित मुद्दे