2011-01-03 7 views
9

हमने अपने भविष्य के मॉड्यूलरलाइजेशन प्रयासों के लिए जेएसआर-330 एनोटेशन के साथ निर्भरता इंजेक्शन का उपयोग करने का निर्णय लिया है, और गुइस 2 एसवीएन के आधार पर पहले वितरित करने से बहुत खुश हूं।मैं जेएसआर-330 @ प्रदाता और @ इंजेक्ट @ नामांकित ("foo") स्ट्रिंग ** प्रोग्रामेटिक रूप से ** वसंत में कैसे कॉन्फ़िगर कर सकता हूं?

अब हमें यूनिट परीक्षणों के माध्यम से सुनिश्चित करने और दस्तावेज करने की आवश्यकता है कि हमें आवश्यक निर्माण, वसंत में भी काम करते समय प्रोग्रामेटिक रूप से कॉन्फ़िगर किया गया है (हम एक ही रिफैक्टरिंग समर्थन चाहते हैं क्योंकि गुइस के साथ कोई एक्सएमएल फाइल नहीं है)। मैं @Provider और @Inject @Named("foo") String समस्याएं आ रही हैं, लेकिन मैं के साथ सादे @Inject काम बना दिया है:

ApplicationContext ctx = new AnnotationConfigApplicationContext(LIBL_Object.class, 
                   CORE_Provider.class); 
this.object = ctx.getBean(LIBL_Object.class); 

जहां LIBL_Object आधार वर्ग है इंजेक्ट किया जा करने के लिए में , लेकिन CORE_Provider पंजीकृत नहीं करता के रूप में मैं वसंत के भीतर आशा व्यक्त की।

CORE_Provider के कार्यान्वयन

package qa.jsr330.core; 

import javax.inject.Provider; 

public class CORE_Provider implements Provider<ProvidedInterface> { 
    @Override 
    public ProvidedInterface get() { 
     return new CORE_Provided(); 
    } 
} 

है और मैं इसे

package qa.jsr330.core; 

import javax.inject.Inject; 

public class LIBL_Object { 

    private ProvidedInterface provided; 

    public ProvidedInterface getProvided() { 
     return provided; 
    } 

    @Inject 
    public void setProvided(ProvidedInterface provided) { 
     this.provided = provided; 
    } 
// Other stuff omitted. 
} 

में इंजेक्शन इसके अलावा हमने पाया है कि हम कॉन्फ़िगरेशन मान बहुत स्पष्ट रूप से @Named टैग का उपयोग कर पारित कर सकते हैं चाहता हूँ। की तरह इस कोड को दिखता है:

String hostname; 
@Inject 
public void setHostname(@Named("as400.hostname") String hostname) { 
    this.hostname = hostname; 
} 

जहाँ हम तो Guice के साथ इस स्ट्रिंग रजिस्टर कर सकते हैं

bindConstant().annotatedWith(Names.named("as400.hostname")).to(value); 

का उपयोग कर तो दो प्रश्न हैं:

  • मैं वसंत के साथ @Provider वर्ग रजिस्टर कैसे करते हैं 3 प्रोग्रामिक रूप से?
  • मैं स्प्रिंग 3 के साथ स्ट्रिंग स्थिरांक कैसे पंजीकृत करूं ताकि @ नामित इसे ठीक से चुन सके?

उत्तर

5

संक्षिप्त उत्तर यह है: वसंत की प्रोग्रामेटिक कॉन्फ़िगरेशन जैसी कोई चीज़ नहीं है।

इस तथ्य के बावजूद कि वसंत और गुइस दोनों जेएसआर-330 एपीआई का समर्थन करते हैं और वसंत को अब एक्सएमएल के बिना कॉन्फ़िगर किया जा सकता है, उनकी विचारधाराएं अभी भी बहुत अलग हैं। वसंत स्थिर विन्यास पर निर्भर करता है, या तो एक्सएमएल फाइलों या एनोटेटेड जावा कक्षाओं के रूप में। इसलिए वसंत में गुइस-शैली कॉन्फ़िगरेशन को अनुकूलित करने का सीधा प्रयास कठिनाइयों का उत्पादन कर सकता है।

Provider के साथ समस्या के बारे में - स्प्रिंग toProvider() Guice में बाध्यकारी रूप में एक ही तरीके से javax.inject.Provider का समर्थन नहीं करता (वैसे, Provider के इस प्रयोग JSR-330 डॉक्स में निर्दिष्ट नहीं है)। इसलिए कुछ वसंत-विशिष्ट एनोटेशन स्प्रिंग विन्यास के स्थिर प्रकृति के कारण उदाहरण

@Configuration 
public class CORE_Provider implements Provider<ProvidedInterface> { 
     @Override @Bean 
     public ProvidedInterface get() { 
      return new CORE_Provided(); 
     } 
} 

बाध्यकारी मूल्य के बाहर से आने वाले कठिन हो सकता है के लिए आवश्यकता हो सकती है। उदाहरण के लिए, अपने मामले में, यह इस तरह से किया जा सकता है:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
ctx.register(IBL_Object.class); 
ctx.register(CORE_Provider.class); 
ctx.registerBeanDefinition("as400.hostname", 
    BeanDefinitionBuilder.rootBeanDefinition(String.class) 
     .addConstructorArgValue(value).getBeanDefinition()); 
ctx.refresh(); 
+1

धन्यवाद! "As400.hostname" इंजेक्शन काम करता है - जो बहुत अच्छा है - लेकिन आपके द्वारा सुझाए गए एनोटेशन के साथ मैंने लिखा है CORE_Provider सबक्लास, उठाया नहीं गया है (लेकिन मैं इंटरफ़ेस का एक उदाहरण पंजीकृत कर सकता हूं, जिसे तब इंजेक्शन दिया जाता है)। मुझे स्प्रिंग से अपवाद "प्रकार का कोई मिलान नहीं है ..." अपवाद मिलता है। मुझे क्या पिक्सी धूल याद आ रही है? –

+0

> स्प्रिंग की प्रोग्रामेटिक कॉन्फ़िगरेशन जैसी कोई चीज़ नहीं है ... मुझे यकीन नहीं है कि "प्रोग्रामैटिक" से आपका क्या मतलब है, लेकिन आपका उदाहरण कोड जहां आप जावा से एनोटेशन कॉन्फिग एप्प्लिकेशन कॉन्टेक्स्ट कॉन्फ़िगर करते हैं, मुझे प्रोग्रामेटिक लगता है? –

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

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