क्या गुइस को दिए गए प्रकार के ऑब्जेक्ट को तत्काल करने के बाद कुछ विधि (यानी init()) को कॉल करना संभव है?ऑब्जेक्ट को तत्काल करने के बाद गिस कॉल इनिट विधि
मैं 3.
क्या गुइस को दिए गए प्रकार के ऑब्जेक्ट को तत्काल करने के बाद कुछ विधि (यानी init()) को कॉल करना संभव है?ऑब्जेक्ट को तत्काल करने के बाद गिस कॉल इनिट विधि
मैं 3.
असल 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();
}
});
}
});
जैसे कुछ अन्य ढांचे को देखना चाह सकते हैं, इसके अलावा एक विकल्प है GuicyFruit का उपयोग करना, जो @PostConstruct का समर्थन करने का दावा करता है (http://code.google.com/p/guiceyfruit देखें /), और जब यह इस सवाल का जवाब नहीं देता है, तो मुझे लगता है कि यह उल्लेखनीय है कि यदि आप (पूरी तरह से) कन्स्ट्रक्टर इंजेक्शन का उपयोग करते हैं, तो आपको ऐसी कार्यक्षमता की आवश्यकता नहीं है क्योंकि आप कन्स्ट्रक्टर में सभी प्रारंभिक कार्य कर सकते हैं। – Eelco
मेरा दिन बचाया। @PostConstruct guiceyfruit अभी तक –
Matchers.subclassesOf (MyInitClass.class) द्वारा समर्थित नहीं है वास्तव में एक संकलन समय त्रुटि का कारण होगा: "विधि bindListener ( सुपर TypeLiteral >> Matcher, TypeListener) प्रकार AbstractModule में लागू नहीं है तर्कों के लिए (Matcher
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);
}
});
}
}
अच्छा उदाहरण के लिए धन्यवाद, बस सोच रहा है कि getMethod ("") कभी शून्य नहीं लौटाता है क्योंकि जब इसे निर्दिष्ट विधि नहीं मिलती है तो यह NoSuchMethodException फेंकता है और javadoc इस पर कोई टिप्पणी नहीं करता है। – zeratul021
मुझे http://code.google.com/p/mycila/wiki/MycilaGuice पसंद है। यह http://code.google.com/p/guiceyfruit के अलावा, गिसिस 3 का समर्थन करता है।
नोट Mycila-guice 3.6 केवल Guice 4.0 के साथ काम करता है लेकिन 4.1 नहीं, अभी तक; https://github.com/mycila/guice/issues/11 देखें। – vorburger
आप अपने init()
विधि में केवल @Inject
एनोटेशन जोड़ सकते हैं। ऑब्जेक्ट तत्काल होने के बाद यह स्वचालित रूप से चलाया जाएगा।
समस्या यह है कि यदि आपके पास वैकल्पिक निर्भरताएं हैं, तो यह दृष्टिकोण काम नहीं करता है, क्योंकि जब तक मुझे पता है कि अंतिम विधि के रूप में आपके init() विधि को कॉल करने के लिए गुइस को बताने का कोई तरीका नहीं है। आईएमएचओ उन्हें @ पोस्टकस्ट्रक्चर समर्थन की आवश्यकता है। –
मैं कन्स्ट्रक्टर इंजेक्शन का उपयोग कर रहा हूं जहां मुझे कुछ प्रारंभिक सामग्री करना है जो अन्य निर्भरताओं के आधार पर है। –
@OrtwinAngermeier, अगर मैं आपको सही ढंग से समझता हूं, तो आप अपने init विधि पर अपने कंस्ट्रक्टर _and_ पर '@ इंजेक्ट 'एनोटेशन डाल सकते हैं। –
GWizard में एक मॉड्यूल (gwizard-services
) शामिल है जो गुवा-अनुकूल प्रारूप में गुवा सेवाएं प्रदान करता है। अमरूद सेवाएं आपको समांतर धागे में जीवन चक्र प्रबंधन प्रदान करती हैं।
दुर्भाग्य से, ऐसा लगता है Guice के लेखकों की तरह जो दृढ़ता से प्रयोज्यता की सीमा है @PostConstruct https://github.com/google/guice/issues/62#issuecomment-115452493 जोड़ने के लिए, कोई इरादा नहीं है Guice (कामकाज हैं, लेकिन वे काफी verbose हैं)। आप स्प्रिंग या जेईई सीडीआई (उदाहरण के लिए, वेल्ड) – arcuri82