2010-08-21 22 views
6

कंटेनरों की सुविधा के बिना हम किसी ऑब्जेक्ट को मैन्युअल रूप से इंजेक्ट कैसे कर सकते हैं। मैंने निम्नानुसार प्रतिबिंब के माध्यम से कुछ ऐसा किया।कैसे निर्भरता इंजेक्शन मैन्युअल रूप से कार्यान्वित?

Class actionClass = Class.forName("SampleClass"); 
Object actionObject = actionClass.newInstance(); 
Method reqMethod = actionClass.getMethod("setRequest", HttpServletRequest.class); 
reqMethod.invoke(actionObject,request); 

क्या यह DI करने का सही तरीका है?

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

उत्तर

0

निर्भरता इंजेक्शन का तात्पर्य है कि आपको "जादू द्वारा" दिखाई देने वाले उचित रूप से प्रारंभिक संदर्भ प्राप्त होते हैं।

आप अनुरोध ऑब्जेक्ट के साथ setRequest() विधि को कॉल करते हैं, लेकिन DI अक्सर विधियों के बिना फ़ील्ड सेट करने की अनुमति भी देता है।

गुइस को कंटेनर की आवश्यकता नहीं होती है, लेकिन मुख्य विधि में कक्षा लोडर जादू का उपयोग करता है। क्या यह आपके लिए उपयोग योग्य होगा?

+0

मुझे "जादू द्वारा" शब्द पसंद है। प्रारंभिकरण कैसे हो रहा है। वसंत या इसी तरह के डी कंटेनर में यह कैसे किया जाता है। –

+1

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

+0

मेरा इरादा अनुरोध ऑब्जेक्ट को डिस्पैचर फ़िल्टर से गतिशील रूप से विभिन्न नियंत्रक कक्षाओं में पास करना है, जहां हमें अनुरोध और प्रतिक्रिया ऑब्जेक्ट मिलते हैं। –

5

निर्भरता इंजेक्शन अपनी निर्भरताओं के साथ कक्षा प्रदान करने के अलावा कुछ भी नहीं है, इसे स्वयं ढूंढने के बजाय (सिंगलेट्स/लुकअप इत्यादि के माध्यम से)। तो आप इसे कोड में तीन बार कर सकते हैं:

DatabaseConnection dc = new DatabaseConnection(); 
MyDAO dao = new MyDAO(dc); 

(छद्म कोड)। यहां MyDAO डेटाबेस कनेक्शन के साथ इंजेक्शन दिया जा रहा है। यदि वह डेटाबेस कनेक्शन एक इंटरफ़ेस लागू करता है तो आप आसानी से परीक्षण के दौरान इसे मॉक कर सकते हैं।

2

ठीक है, जब आप एक ऑब्जेक्ट को सेटटर विधि या कन्स्ट्रक्टर के माध्यम से किसी अन्य ऑब्जेक्ट में सेट करते हैं तो यह निर्भरता इंजेक्शन भी होता है। निर्भरता इंजेक्शन का मतलब केवल वस्तुओं में संबंध (निर्भरता) बनाना है।

आपके द्वारा किए गए प्रतिबिंब का उपयोग करना इसका एक और रूप है।

1

आप प्रतिबिंब का उपयोग क्यों करेंगे? क्यों बस नहीं:

SampleClass action = new SampleClass(); 
action.setRequest(request); 

कि एक ही बात करता है, लेकिन अधिक पठनीय है, संकलक जाँच करने के लिए है कि प्रकार के और तरीकों वास्तव में मौजूद अनुमति देता है विधि लागू के लिए जावाडोक प्रदान करता है, करने में सहायता करने के लिए अपने आईडीई में सक्षम बनाता है refactorings, ...

और यह अभी भी निर्भरता इंजेक्शन है, क्योंकि कार्रवाई इसके अनुरोध की तलाश नहीं करती है, लेकिन प्रारंभिकरण के दौरान अनुरोध प्राप्त करती है।

संपादित करें: Thorbjørn ने अनुरोध किया कि मैं दिखाता हूं कि उस क्रिया का उपयोग कैसे किया जाएगा। यह भी इंजेक्शन (एक सेटर का उपयोग करके) किया जाएगा जो भी घटक कार्रवाई का उपयोग करता है। घटक इंजेक्शन एक्शन ऑब्जेक्ट का उपयोग करेगा। servlet में एक ActionFactory-इंजेक्षन सेटर

SampleClass action = new SampleClass(); 
action.setRequest(request); 
Servlet servlet = new ActionBasedServlet(); 
servlet.setAction(action); 

तो servlet, कर सकते हैं action से अधिक समय रहने के लिए है, यानी यह एक ताजा Action हर बार यह एक जरूरत है का उपयोग करना चाहिए करना है एक के बजाय।

इस ठोस मामले में, मैं सवाल करता हूं कि कार्रवाई को वास्तव में अपने राज्य के हिस्से के रूप में अनुरोध रखने की आवश्यकता है या अपरिवर्तनीय हो सकता है और सर्वलेट द्वारा विधि पैरामीटर के रूप में पारित अनुरोध पर कार्य कर सकता है।उस मामले में, बूट समय प्रारंभ करना होगा:

SampleClass action = new SampleClass(); 
Servlet servlet = new ActionBasedServlet(); 
servlet.setAction(action); 

और ActionBasedServlet परिभाषित करेगा

public void serve(Request req, Response resp) { 
    foo(); 
    action.act(req, resp); 
    bar(); 
} 
+0

'नया' कीवर्ड वर्तमान वर्ग से एक नए के लिए एक बेहद मजबूत बाध्यकारी देता है। निर्भरता इंजेक्शन _decouples_ दोनों के बीच यह मजबूत बाध्यकारी। –

+3

निर्भरता इंजेक्शन घटक को इसकी निर्भरताओं से हटा देता है। इसका मतलब यह नहीं है कि घटक और इसकी निर्भरता दोनों को जानने वाले कोड का एक और हिस्सा नहीं होना चाहिए। नमूना क्लास मेरे उदाहरण में विशेष अनुरोध के साथ नहीं है। – meriton

+0

मेरे मामले में, वर्गनाम गतिशील है। सभी वर्गों के लिए एक सामान्य DI बनाने के लिए। यानी मैंने प्रतिबिंब का उपयोग क्यों किया। आपके उत्तर के लिए धन्यवाद। –

0

स्प्रिंग ढांचे सबसे लोकप्रिय डि कार्यान्वयन से एक है। यह ओपनसोर्स भी है। आप क्लास org.springframeowrk.beans.BeanUtils को देख सकते हैं, विशेष रूप से विधियों की प्रतिलिपि (उनमें से सभी 4) उदाहरण के लिए यह कैसे करें। अधिक जानकारी के लिए आप विभिन्न रणनीतियों के लिए org.springframework.beans.factory.BeanFactory की श्रेणी पदानुक्रम भी देख सकते हैं।

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