2013-08-26 6 views
16

की आवश्यकता वाले फ़ैक्टरी विधि के लिए स्प्रिंग बीन को इंजेक्ट कैसे करें I java.util.prefs को इंजेक्ट करने का प्रयास कर रहा हूं। मेरे मास्टर नियंत्रक में संदर्भ बीन। आवेदन-context.xml फ़ाइलMyClass.class पैरामीटर

@Controller 
class MyController { 
    @Autowired 
    private Preferences preferences; 
} 

java.util.prefs.Preferences के लिए सेम बनाता है: नियंत्रक की तरह दिखता है।

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" /> 

Preferences.userNodeForPackage (परम) एक पैरामीटर पसंद से संबंधित वर्ग के लिए ले जाता है: यह एक कारखाने विधि तो मैं सेम बनाने के लिए निम्नलिखित प्रविष्टि का उपयोग करता है। इस मामले में वसंत कॉल प्रदर्शन करके सेम बनाने के लिए की जरूरत है:

Preferences.userNodeForPackage(MyController.class); 

कैसे एक वर्ग एक वसंत सेम एक कारखाने विधि के साथ instantiated करने के लिए पारित किया जा सकता है? धन्यवाद

पर्यावरण जानकारी:

Java 7 
Spring 3.1 

उत्तर

22

आप constructor-arg तत्व

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage"> 
    <constructor-arg type="java.lang.Class" value="com.path.MyController" /> 
</bean> 

यह आधिकारिक दस्तावेज here, खंड 5.4.1 से समझाया गया है निर्दिष्ट कर सकते हैं। स्थिर कारखाने विधि के लिए

तर्क तत्वों के माध्यम से आपूर्ति की जाती है, ठीक उसी था के रूप में अगर एक निर्माता वास्तव में इस्तेमाल किया गया। फैक्टरी विधि द्वारा लौटाए जाने वाले वर्ग के प्रकार को उसी प्रकार के होने की आवश्यकता नहीं है, जो में स्थिर फैक्ट्री विधि है, हालांकि इस उदाहरण में यह है। एक उदाहरण (गैर स्थैतिक) फैक्ट्री विधि का उपयोग अनिवार्य रूप से समान फैशन (क्लास एट्रिब्यूट के बजाय कारखाने-बीन विशेषता के उपयोग से अलग) में किया जाएगा, इसलिए विवरणों पर पर चर्चा नहीं की जाएगी।

+0

वह @NandkumarTekale उद्धरण और प्रलेखन पढ़ें 'Preferences' –

+2

की()' विधि, निर्माता नहीं 'userNodeForPackage को पैरामीटर के रूप में तर्क प्रदान करने के लिए की जरूरत है। जब आपने 'फैक्ट्री-विधि' विशेषता निर्दिष्ट की है तो आप ऐसा करते हैं। –

+0

+1 अच्छा एक। :) –

2
public class Preferences 
{ 
    SomeBean someBean; 

    public void setSomeBean(SomeBean someBean){ 
      this.someBean = someBean; 
    } 

    public static Preferences createSampleBeanWithIntValue(SomeBean someBean) 
    { 
     Preferences preferences= new Preferences(); 
     preferences.setSomeBean(someBean); 
     return preferences; 
    } 
} 

    <bean id="someBean" class="java.util.prefs.SomeBean"/> 

<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" > 

    <constructor-arg ref="someBean "/>  
</bean> 

कृपया संदर्भ

http://www.skorks.com/2008/10/are-you-using-the-full-power-of-spring-when-injecting-your-dependencies/

-1

आप "वरीयताएं" "MyController" की संपत्ति बनाने का प्रयास करें कर सकते हैं देखते हैं। कुछ की तरह

<bean id="MyController" class="com.your.package.MyController"> 
    <property name="preferences" ref="preferences" /> 
</bean> 

और फिर MyController में वरीयताओं के लिए गेटर और सेटर विधि है।

मुझे लगता है कि यह काम करना चाहिए।

+1

ओपी की समस्या ऑब्जेक्ट को स्वचालित नहीं कर रही है। समस्या एक स्थिर फैक्ट्री-विधि को निर्दिष्ट और तर्क दे रही है। –

3

ठीक है मुझे एक्सएमएल आधारित कॉन्फ़िगरेशन तरीका नहीं पता है, लेकिन मैं आपको बता सकता हूं कि आप Configuration कक्षा के माध्यम से इसे कैसे तुरंत चालू कर सकते हैं।

@Configuration 
public class Config { 
    @Bean(name="preferences") 
    public java.util.prefs.Preferences preferences() { 
     // init 
     return java.util.prefs.Preferences.userNodeForPackage(YourExpectedClass.class); 
    } 
} 

पीएस :

आपको वेब में स्कैनिंग के लिए अपनी कॉन्फ़िगरेशन क्लास/पैकेज जोड़ने की आवश्यकता होगी।एक्सएमएल अगर आप या पूरा एनोटेशन आधारित दृष्टिकोण [contextClass=org.springframework.web.context.support.AnnotationConfigWebApplicationContext] उपयोग कर रहे हैं, जैसा कि नीचे अपने कॉन्फ़िग फ़ाइल में:

<context:component-scan base-package="com.comp.prod.conf" /> 
+0

आंखों के लिए +1 आंख: पी –

+0

+1 शायद आपके उत्तर में उल्लेख किया जाना चाहिए यह मेवेन में वसंत-संदर्भ कलाकृति से आता है। –

0

पहले 'प्राथमिकताएं' वर्ग के सेम बना सकते xml फ़ाइल का उपयोग कर या एनोटेशन का उपयोग कर।
तो आप इस <context:annotation-config> उपयोग कर सकते हैं अगर आप एक्सएमएल विन्यास का उपयोग कर @Autowired एनोटेशन कार्यक्षमता
(या)

<context:component-scan base-package="com.estudo.controller" />
सक्रिय करने के लिए अगर आप टिप्पणियों का उपयोग करने की फलियों बनाया सेम बनाया।
नोट: वसंत सर्वलेट xml फ़ाइल

0

स्प्रिंग फ्रेमवर्क फ़ैक्टरी विधि का उपयोग करके बीन इंजेक्ट करने की सुविधा प्रदान करता है। ऐसा करने के लिए, हम बीन तत्व के दो विशेषताओं का उपयोग कर सकते हैं।

फैक्ट्री-विधि: फैक्ट्री विधि का प्रतिनिधित्व करता है जिसे बीन इंजेक्ट करने के लिए बुलाया जाएगा। फैक्ट्री-बीन: बीन के संदर्भ का प्रतिनिधित्व करता है जिसके द्वारा फैक्ट्री विधि लागू की जाएगी। इसका उपयोग तब किया जाता है जब कारखाना विधि गैर स्थैतिक है। एक विधि जो कक्षा के उदाहरण लौटाती है उसे फैक्ट्री विधि कहा जाता है।

public class A { 
public static A getA(){//factory method 
    return new A(); 
} 
}