2012-09-21 18 views
22

मेरे पास स्थिर विधियों के साथ एक यूटिल क्लास है। मेरी यूटिल क्लास के अंदर, मैं वसंत सेम का उपयोग करना चाहता हूं इसलिए मैंने उन्हें अपने उपयोग वर्ग में शामिल किया। जहां तक ​​मुझे पता है कि वसंत बीन्स का उपयोग स्थैतिक क्षेत्रों के रूप में करने के लिए एक अच्छा अभ्यास नहीं है। लेकिन क्या एक स्थिर विधि में वसंत बीन्स तक पहुंचने का कोई तरीका है?स्थैतिक विधि में वसंत बीन्स तक पहुंच

मेरे उदाहरण:

public class TestUtils { 

    private static TestBean testBean; 

    public void setTestBean(TestBean testBean) { 
    TestUtils.testBean = testBean; 
    } 

    public static String getBeanDetails() { 
    return beanName = testBean.getDetails(); 
    } 
} 

मैं कई मंचों में देखा है कि यह एक सबसे अच्छा अभ्यास नहीं है। क्या कोई मुझे दिखा सकता है कि मैं इस प्रकार के परिदृश्य को कैसे संभाल सकता हूं?

मेरे विन्यास फाइल:

<bean id="testUtils" class="com.test.TestUtils"> 
<property name="testBean" ref="testBean" /> 
</bean> 

उत्तर

0

दृष्टिकोण आप रेखांकित किया है कि मैं क्या एक उपयोगिता वर्ग में एक स्प्रिंग की फलियों इंजेक्षन इस्तेमाल किया जा रहा देखा है।

<bean id="testUtils" class="com.test.TestUtils"> 
<property name="testBean" ref="testBean" /> 
</bean> 

एक अन्य विकल्प है:

<bean name="methodInvokingFactoryBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="staticMethod" value="TestUtils.setInstance"/> 
     <property name="arguments"> 
      <list> 
       <ref bean="testBean"/> 
      </list> 
     </property> 
</bean> 

साथ:

public class TestUtils { 

    private static testBean; 

    public static void setInstance(TestBean anInstance) { 
    testBean = anInstance; 
    } 

    public static String getBeanDetails() { 
    return testBean.getDetails(); 
    } 
} 

अधिक जानकारी here और here

+0

नहीं मेरे लिए स्पष्ट .. तुम plz कर सकते हैं testBean विन्यास जोड़ सकता हूँ? – TechSpellBound

1

हैं इस तरह मैं एक स्थिर क्षेत्र के लिए वसंत से इंजेक्शन है।

<bean id="..." class="..."> 
<property name="fieldToBeInjected"> 
      <util:constant static-field="CONSTANT_FIELD" /> 
     </property> 
</bean> 

शायद यह आपकी मदद करेगा।

10

स्थैतिक तरीकों का नतीजा केवल विधि में पारित पैरामीटर पर निर्भर होना चाहिए, इसलिए किसी भी बीन को कॉल करने की आवश्यकता नहीं है।

यदि आपको एक और बीन कॉल करने की आवश्यकता है तो आपकी विधि एक स्टैंडअलोन बीन का सदस्य तरीका होना चाहिए।

अन्य उत्तरों आपको कामकाजी समाधान देते हैं, लेकिन तथ्य यह है कि इसका मतलब यह नहीं है कि यह किया जाना चाहिए।

+0

हां, मुझे लगता है कि हमें इसे स्थैतिक वर्ग में सीधे सेट करने के बजाय पैरामीटर के रूप में उपयोग करना चाहिए। मानकों के आधार पर यह कहता है कि हमें बीन का उपयोग स्थिर के रूप में नहीं करना चाहिए, हालांकि हम उपर्युक्त प्रतिक्रियाओं में दिखाए गए विभिन्न तरीकों से ऐसा कर सकते हैं। उत्तर के लिए धन्यवाद। – Rosh

+1

"स्थैतिक तरीकों का नतीजा केवल विधि में पारित पैरामीटर पर निर्भर होना चाहिए", अच्छा शॉट! – Nickolas

9

आप भी ApplicationContextAware इंटरफ़ेस को लागू कर सकते हैं, इस तरह:

@Component 
public class TestUtils implements ApplicationContextAware { 

    private static ApplicationContext ac; 

    public static String getBeanDetails() { 
    return beanName = ((TestBean) ac.getBean("testBean")).getDetails(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext ac) { 
    this.ac = ac; 
    } 

} 
29

मेरे दृष्टिकोण सेम एक InitializingBean लागू करने या @PostConstruct उपयोग करने के लिए उपयोग करने के लिए चाहता है, और खुद के लिए एक स्थिर संदर्भ शामिल करने के कारण है।

उदाहरण के लिए:

अपने स्थिर कक्षा में
@Service 
public class MyBean implements InitializingBean { 
    private static MyBean instance; 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     instance = this; 
    } 

    public static MyBean get() { 
     return instance; 
    } 
} 

प्रयोग इसलिए सिर्फ होगा:

MyBean myBean = MyBean.get(); 

इस तरह, कोई एक्सएमएल विन्यास की आवश्यकता है, तो आप में सेम पारित करने के लिए की जरूरत नहीं है एक कन्स्ट्रक्टर तर्क के रूप में, और कॉलर को यह जानने की आवश्यकता नहीं है कि वसंत का उपयोग करके बीन को तारित किया जाता है (यानी, गन्दा ApplicationContext चर के लिए कोई आवश्यकता नहीं है)।

+0

slick - क्या वसंत में ऐसी आवर्ती समस्याओं के लिए सही समाधान खोजने के लिए कोई अच्छी जगह है ..? –

1

@ nullPainter की प्रतिक्रिया के समान, लेकिन हमने निम्नलिखित किया। कोई पोस्ट-निर्माण तर्क आवश्यक नहीं है।यह सिर्फ इंजेक्शन के दौरान स्थिर सदस्य को सेट करता है (@Autowired विधि में)।

@Service 
public class MyUtil { 

    private static MyManager myManager; 

    @Autowired(required = true) 
    public void setMyManager(MyManager manager) { 
     myManager = manager; 
    } 

    public static MyManager getMyManager() { 
     return myManager; 
    } 
} 
+0

'आवश्यक = सत्य' param को पास करने की आवश्यकता नहीं है क्योंकि यह '@ Autowired' के लिए डिफ़ॉल्ट मान है। तो केवल '@Autowired सार्वजनिक शून्य सेट MyManager (MyManager प्रबंधक) { myManager = प्रबंधक; } ' पर्याप्त होगा। – rumman0786

+0

को @ सेवा एनोटेशन की आवश्यकता होती है जो कम समझ में आता है – rohanagarwal

0

यह मेरे लिए काम करता है।

import org.springframework.web.context.ContextLoader; 
import org.springframework.web.context.WebApplicationContext; 

WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext(); 
DataSource datasource = (DataSource)context.getBean("dataSourceDB_01");  

और मेरे एक्सएमएल विन्यास में: कुछ वर्ग में

<bean id="dataSourceDB_01" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"><value>${db.driver}</value></property>  
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${db.username_seg}</value></property> 
    <property name="password"><value>${db.password_seg}</value></property> 
</bean> 

HTH

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