2010-01-19 15 views
53

क्या गुइस को दिए गए प्रकार के ऑब्जेक्ट को तत्काल करने के बाद कुछ विधि (यानी init()) को कॉल करना संभव है?ऑब्जेक्ट को तत्काल करने के बाद गिस कॉल इनिट विधि

मैं 3.

+0

दुर्भाग्य से, ऐसा लगता है Guice के लेखकों की तरह जो दृढ़ता से प्रयोज्यता की सीमा है @PostConstruct https://github.com/google/guice/issues/62#issuecomment-115452493 जोड़ने के लिए, कोई इरादा नहीं है Guice (कामकाज हैं, लेकिन वे काफी verbose हैं)। आप स्प्रिंग या जेईई सीडीआई (उदाहरण के लिए, वेल्ड) – arcuri82

उत्तर

28

असल EJB में एनोटेशन @PostConstruct के समान कार्यक्षमता के लिए देखो, यह संभव है।

कार्यक्षमता प्राप्त करने के लिए आपको TypeListener को परिभाषित करने की आवश्यकता है। अपने मॉड्यूल परिभाषा निम्नलिखित की तर्ज पर कुछ:

bindListener(Matchers.subclassesOf(MyInitClass.class), new TypeListener() { 
    @Override 
    public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) { 
     typeEncounter.register(new InjectionListener<I>() { 
      @Override 
      public void afterInjection(Object i) { 
       MyInitClass m = (MyInitClass) i; 
       m.init(); 
      } 
     }); 
    } 
}); 
+4

जैसे कुछ अन्य ढांचे को देखना चाह सकते हैं, इसके अलावा एक विकल्प है GuicyFruit का उपयोग करना, जो @PostConstruct का समर्थन करने का दावा करता है (http://code.google.com/p/guiceyfruit देखें /), और जब यह इस सवाल का जवाब नहीं देता है, तो मुझे लगता है कि यह उल्लेखनीय है कि यदि आप (पूरी तरह से) कन्स्ट्रक्टर इंजेक्शन का उपयोग करते हैं, तो आपको ऐसी कार्यक्षमता की आवश्यकता नहीं है क्योंकि आप कन्स्ट्रक्टर में सभी प्रारंभिक कार्य कर सकते हैं। – Eelco

+0

मेरा दिन बचाया। @PostConstruct guiceyfruit अभी तक –

+7

Matchers.subclassesOf (MyInitClass.class) द्वारा समर्थित नहीं है वास्तव में एक संकलन समय त्रुटि का कारण होगा: "विधि bindListener (> Matcher, TypeListener) प्रकार AbstractModule में लागू नहीं है तर्कों के लिए (Matcher , नया टाइपलिस्टर() {}) " मुझे लगता है कि आपको अपना कोड काम करने के लिए AbstractMatcher का विस्तार करना होगा – Andrey

6

guiceyfruit करता है आप के साथ एनोटेट तरीकों के लिए के बाद क्या कर रहे हैं @PostConstruct या वसंत के InitializingBean को लागू करने। ऐसा करने के लिए अपने स्वयं के श्रोताओं को लिखना भी संभव है। यहां एक उदाहरण दिया गया है जो वस्तुओं के निर्माण के बाद सार्वजनिक init() विधि को कॉल करता है।

import com.google.inject.*; 
import com.google.inject.matcher.*; 
import com.google.inject.spi.*; 

public class MyModule extends AbstractModule { 
    static class HasInitMethod extends AbstractMatcher<TypeLiteral<?>> { 
    public boolean matches(TypeLiteral<?> tpe) { 
     try { 
     return tpe.getRawType().getMethod("init") != null; 
     } catch (Exception e) { 
     return false; 
     } 
    } 

    public static final HasInitMethod INSTANCE = new HasInitMethod(); 
    } 

    static class InitInvoker implements InjectionListener { 
    public void afterInjection(Object injectee) { 
     try { 
     injectee.getClass().getMethod("init").invoke(injectee); 
     } catch (Exception e) { 
     /* do something to handle errors here */ 
     } 
    } 
    public static final InitInvoker INSTANCE = new InitInvoker(); 
    } 

    public void configure() { 
    bindListener(HasInitMethod.INSTANCE, new TypeListener() { 
     public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) { 
     encounter.register(InitInvoker.INSTANCE); 
     } 
    }); 
    } 
} 
+0

अच्छा उदाहरण के लिए धन्यवाद, बस सोच रहा है कि getMethod ("") कभी शून्य नहीं लौटाता है क्योंकि जब इसे निर्दिष्ट विधि नहीं मिलती है तो यह NoSuchMethodException फेंकता है और javadoc इस पर कोई टिप्पणी नहीं करता है। – zeratul021

49

आप अपने init() विधि में केवल @Inject एनोटेशन जोड़ सकते हैं। ऑब्जेक्ट तत्काल होने के बाद यह स्वचालित रूप से चलाया जाएगा।

+9

समस्या यह है कि यदि आपके पास वैकल्पिक निर्भरताएं हैं, तो यह दृष्टिकोण काम नहीं करता है, क्योंकि जब तक मुझे पता है कि अंतिम विधि के रूप में आपके init() विधि को कॉल करने के लिए गुइस को बताने का कोई तरीका नहीं है। आईएमएचओ उन्हें @ पोस्टकस्ट्रक्चर समर्थन की आवश्यकता है। –

+0

मैं कन्स्ट्रक्टर इंजेक्शन का उपयोग कर रहा हूं जहां मुझे कुछ प्रारंभिक सामग्री करना है जो अन्य निर्भरताओं के आधार पर है। –

+1

@OrtwinAngermeier, अगर मैं आपको सही ढंग से समझता हूं, तो आप अपने init विधि पर अपने कंस्ट्रक्टर _and_ पर '@ इंजेक्ट 'एनोटेशन डाल सकते हैं। –

1

GWizard में एक मॉड्यूल (gwizard-services) शामिल है जो गुवा-अनुकूल प्रारूप में गुवा सेवाएं प्रदान करता है। अमरूद सेवाएं आपको समांतर धागे में जीवन चक्र प्रबंधन प्रदान करती हैं।

https://github.com/stickfigure/gwizard

संबंधित मुद्दे

 संबंधित मुद्दे