आइए हम इसे दो उदाहरणों के माध्यम से समझने का प्रयास करें।
उदाहरण 1
पहले के दिनों में, उपयोगकर्ता के इनपुट को एक के बाद एक स्वीकार करने के लिए कमांड प्रॉम्प्ट उत्पन्न करने वाले ऐप्स का उपयोग किया जाता था। आज, यूआई चौखटे विभिन्न यूआई तत्वों को इंस्टेंट करता है, उन यूआई तत्वों (जैसे माउस होवर, क्लिक इत्यादि) की विभिन्न घटनाओं के माध्यम से लूप और उपयोगकर्ता / मुख्य कार्यक्रम उन घटनाओं को सुनने के लिए हुक (उदाहरण के लिए जावा में यूआई घटना श्रोता) प्रदान करता है। तो मुख्य यूआई तत्व प्रवाह "नियंत्रण" को उपयोगकर्ता कार्यक्रम से यूआई फ्रेमवर्क में स्थानांतरित किया जाता है। पहले के दिनों में, यह उपयोगकर्ता कार्यक्रम में था।
उदाहरण 2
CustomerProcessor
नीचे वर्ग पर विचार करें:
class CustomerProcessor
{
SqlCustRepo custRepo = new SqlCustRepo();
private void processCustomers()
{
Customers[] custs = custRepo.getAllCusts();
}
}
अगर मैं processCustomer()
किसी भी कार्यान्वयन के लिए स्वतंत्र होना चाहता हूं getAllCusts()
, न कि केवल एक के द्वारा प्रदान की गई SqlCustRepo
, मुझे लाइन से छुटकारा पाने की आवश्यकता होगी: SqlCustRepo custRepo = new SqlCustRepo()
और इसे कुछ और सामान्य के साथ प्रतिस्थापित करें, विभिन्न प्रकार के कार्यान्वयन को स्वीकार करने में सक्षम, जैसे कि processCustomers()
बस के लिए काम करेंगे कोई भी कार्यान्वयन। उपरोक्त कोड ( SqlCustRepo
मुख्य प्रोग्राम लॉजिक द्वारा आवश्यक वर्ग की तात्कालिकता ) एक पारंपरिक तरीका है और इसे processCustomers()
लागू करने से डिकॉउलिंग के इस लक्ष्य को प्राप्त नहीं होता है getAllCusts()
। नियंत्रण के उलट में, कंटेनर आवश्यक कार्यान्वयन वर्ग को बताता है (जैसा कि xml विन्यास के अनुसार निर्दिष्ट किया गया है), इसे मुख्य कार्यक्रम तर्क में इंजेक्ट करता है जो निर्दिष्ट हुक के अनुसार बाध्य हो जाता है ( स्प्रिंग फ्रेमवर्क में @Autowired
एनोटेशन या getBean()
विधि के अनुसार)।
आइए देखें कि यह कैसे किया जा सकता है। नीचे दिए गए कोड पर विचार करें।
config.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="custRepo" class="JsonCustRepo" />
</beans>
CustRepo.java
interface ICustRepo
{ ... }
JsonCustRepo.java
class JsonCustRepo implements CustRepo
{ ... }
App.java
class App
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("Config.xml");
ICustRepo custRepo = (JsonCustRepo) context.getBean("custRepo");
}
}
हम भी कर सकते हैं
class GraphCustRepo implements ICustRepo { ... }
तथा
<bean id="custRepo" class="GraphCustRepo">
और हमें App.java को बदलने की आवश्यकता नहीं होगी।
कंटेनर के ऊपर (जो कि स्प्रिंग फ्रेमवर्क है) xml फ़ाइल को स्कैन करने, विशिष्ट प्रकार के बीन को तुरंत निकालने और उपयोगकर्ता प्रोग्राम में इंजेक्ट करने की जिम्मेदारी है। उपयोगकर्ता प्रोग्राम का कोई नियंत्रण नहीं है कि किस वर्ग को त्वरित किया जाए।
पुनश्च: IoC सामान्य अवधारणा है और कई मायनों में हासिल की है। उपरोक्त उदाहरण निर्भरता इंजेक्शन द्वारा इसे प्राप्त करते हैं।
संदर्भ: मार्टिन फाउलर का लेख ।