आम तौर पर गुइस को इंजेक्ट करने के लिए वस्तुओं को बनाने की आवश्यकता होती है। यदि आप बस new StarryEyes(name)
पर कॉल करते हैं, तो गुइस उस ऑब्जेक्ट को कभी नहीं देख पाएगा, इसलिए यह इंजेक्ट करने में सक्षम नहीं होगा। एक चीज जो आप कर सकते हैं उसे ऑब्जेक्ट पर injector.injectMembers(obj)
पर कॉल करने के बाद कॉल करना है। मैं इसकी अनुशंसा नहीं करता, हालांकि, आपको अपने कोड में इंजेक्टर का संदर्भ देने से बचना चाहिए।
आप वास्तव में यहां क्या चाहते हैं Assisted Inject है। प्रदान की
@Inject public StarryEyes(MyValidator validator, @Assisted String name)
कि क्या मतलब है, कि validator
एक पैरामीटर है कि Guice इंजेक्षन चाहिए है, जबकि name
चाहिए "सहायता" हो (जो है,: असिस्टेड इंजेक्षन के साथ, आप इस तरह अपने वर्ग के लिए कुछ निर्माता की घोषणा करता हूँ उस समय उदाहरण बनाया गया है)।
public interface StarryEyesFactory {
StarryEyes create(String name);
}
असिस्टेड इंजेक्षन के साथ, Guice तो आप के लिए है कि कारखाने को लागू कर सकते हैं:
फिर आप इस तरह एक अंतरफलक पैदा करते हैं। आप इसे इस तरह बाँध:
bind(StarryEyesFactory.class).toProvider(
FactoryProvider.newFactory(StarryEyesFactory.class, StarryEyes.class));
फिर आप इंजेक्षन एक StarryEyesFactory
कहीं भी आप इसे का एक उदाहरण बनाना चाहते हैं। जहां आप पहले new StarryEyes(name)
कहलाते थे, अब आप starryEyesFactory.create(name)
पर कॉल करते हैं। जब आप कारखाने पर create(name)
पर कॉल करते हैं, तो यह नाम ले जाएगा और इसे निर्माता को पास कर देगा और बाध्य सत्यापनकर्ता स्वयं प्रदान करेगा।
install(new FactoryModuleBuilder().build(StarryEyesFactory.class));
:
Guice 3 में प्रारंभ हो, तो आप इस एक FactoryModuleBuilder का उपयोग करते हैं