2013-02-25 49 views
11

में फ्लाई पर उदाहरण कैसे बनाएं, मान लीजिए कि मेरे पास कार श्रेणी है। मेरे कोड में मैं 10 कार बनाना चाहता हूं। कार श्रेणी में कुछ @ इंजेक्ट एनोटेटेड निर्भरताएं हैं। ऐसा करने का सबसे अच्छा तरीका क्या होगा? अगर मैं एक CarFactory जो बनाता है @Produces टिप्पणी के साथ एक विधि है कि नहीं है दुर्भाग्य से वह काम नहीं करतासीडीआई

@Inject Provider<Car> carProvider; 
public void businessMethod(){ 
    Car car = carProvider.get(); 
} 

:

CDI जो मैं कारों को बनाने के लिए उपयोग कर सकते हैं एक प्रदाता इंटरफ़ेस है गाड़ी। जितना ज्यादा यह वास्तविक दुनिया को दर्शाता है कि मैं कारखाने के बिना कार नहीं बना सकता, मैं सबकुछ के लिए कारखानों को नहीं लिखूंगा। मैं बस सीडीआई कंटेनर चाहता हूं कि मेरी कार को किसी भी अन्य बीन की तरह बनाया जाए। आप उन कारों को बनाने की सलाह कैसे देते हैं?

उत्तर

8

बस javax.enterprise.inject का उपयोग करें। इसके बजाय इंटरफ़ेस इंटरफ़ेस का उपयोग करें।

इस तरह:

public class Bean { 

    private Instance<Car> carInstances; 

    @Inject 
    Bean(@Any Instance<Car> carInstances){ 
     this.carInstances = carInstances; 
    } 

    public void use(){ 
     Car newCar = carInstances.get(); 
     // Do stuff with car ... 
    } 

} 
+0

यह वास्तव में है जो मैंने उपयोग किया है।क्या आप अपना उदाहरण ठीक कर सकते हैं, कन्स्ट्रक्टर तर्क क्लास विशेषता के समान प्रकार नहीं है: कार बनाम यूआईएमओएल। मुझे लगता है कि इंजेक्शन @ एनी के बजाय @New के साथ एनोटेटेड होना चाहिए। और उपयोग() - विधि के लिए एक बेहतर उदाहरण एक ऐसा होगा जो आपको दिखाएगा कि आपको कार का उदाहरण कैसे मिलेगा। उदाहरण के लिए 'carInstances.get() ' – palto

+0

@New को डीडीआई 1.1 में हटा दिया गया है, @ पर निर्भर बीन्स की प्राथमिकता में। सीडीआई 1.1, सेक्शन 3.14 देखें। मुझे यह नहीं लगता कि प्रदाता का उपयोग करने में क्या गलत है, i। ई।, 'CDI.current()। चुनें (कार.क्लास) .get()'? –

+0

@ मार्टिन एंडर्सन मूल समस्या यह थी कि मुझे प्रदाता का उपयोग करने के लिए एक कारखाना बनाना पड़ा। टिप्पणी में प्रदान किया गया उदाहरण मेरे लिए बिल्कुल नया है। शायद आप इससे जवाब बना सकते हैं? – palto

2

आप अपने @Produces एनोटेशन के साथ क्वालिफायर इस्तेमाल कर सकते हैं:

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) 
public @interface MyCars { 
} 

नमूना-निर्माता-विधि:

@Produces 
@MyCars 
public Car getNewCar(@New Car car){ 
    return car; 
} 

उपयोग:

@Inject 
@MyCars 
private Provider<Car> carProvider; 
+0

'@Ne को डीडीआई 1.1 में बहिष्कृत किया गया है, @ पर निर्भर बीन्स की प्राथमिकता में। सीडीआई 1.1, सेक्शन 3.14 देखें। –

+0

@MartinAndersson मैं कि पता है, लेकिन जवाब के समय के रूप में CDI 1.1 बाहर नहीं था, इसलिए जवाब CDI 1.0 को जाता है (सिर्फ इस यहाँ स्पष्ट करने के लिए) – FibreFoX

0

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

+0

गुंजाइश मैं के रूप में जहाँ तक, के बारे में चिंता करने के लिए कुछ नहीं है समझा जाता है कि वह एक इंजेक्शन निर्माता बनाना चाहता था और एक विशिष्ट निर्माता वर्ग को लागू नहीं करना चाहता था। आप सही हैं, कि सभी इंजेक्शन वाले सीडीआई-बीन्स '@ आश्रित' बन जाते हैं, लेकिन यह नहीं है कि पैल्टो – FibreFoX

+0

"हर बार इंजेक्शन होने पर एक नया उदाहरण" के बारे में बात कर रहा था? कैसे एक आश्रित इंजेक्ट किया जा सकता "हर बार"? इंजेक्शन केवल एक बार होता। प्रॉक्सी का। यदि एक @Dependent सेम, या प्रॉक्सी, इंजेक्ट किया गया था, तो यह प्रॉक्सी की प्रत्येक कॉल हमेशा एक और एक ही समर्थन सेम को कराई जाएगी। –

+0

यह, एक बार प्रॉक्सी injects हाँ, लेकिन अगर कि प्रॉक्सी तो एक आश्रित scoped सेम टू कि निर्भर scoped सेम सेम के प्रत्येक नया उदाहरण इंजेक्शन का अनुरोध पर नई बनाई गई है। इंजेक्शन बीन दूसरे के जीवन चक्र पर निर्भर हो जाता है। – LightGuard

5

कार्यक्रम संबंधी देखने के लिए मेरा पसंदीदा मॉडल CDI.current().select().get() उपयोग करने के लिए है।

here प्रदर्शित किया गया।

सर्वलेट दो CDI फलियों पर निर्भरता है, एक अनुरोध scoped और अन्य आवेदन scoped:

private final RequestScopedBean requestScoped 
      = CDI.current().select(RequestScopedBean.class).get(); 

private final ApplicationScopedBean applicationScoped 
      = CDI.current().select(ApplicationScopedBean.class).get(); 

परीक्षण वर्ग इस सर्वलेट का उपयोग करता है here पाया जा सकता है।

कोड की जांच करें और आप देखेंगे कि कोड @Inject MyBean myBean; का उपयोग करके आप जो भी प्राप्त करेंगे उसके बराबर है।