আসুন দুটি উদাহরণের মাধ্যমে এটি বোঝার চেষ্টা করি।
উদাহরণ 1
আগের দিনগুলিতে, কমান্ড তৈরি করতে ব্যবহৃত অ্যাপ্লিকেশনগুলি একের পর এক ব্যবহারকারীদের ইনপুট গ্রহণ করতে অনুরোধ করে। আজ, ইউআই ফ্রেমওয়ার্কগুলি বিভিন্ন ইউআই উপাদানগুলি ইনস্ট্যান্ট করে, সেই ইউআই উপাদানগুলির বিভিন্ন ইভেন্টের মধ্য দিয়ে লুপ (যেমন মাউস হোভার, ক্লিক ইত্যাদি) এবং ব্যবহারকারী / প্রধান প্রোগ্রামগুলি সেই ঘটনাগুলি শোনার জন্য হুক সরবরাহ করে (উদাহরণস্বরূপ জাভাতে ইউআই ইভেন্ট শ্রোতা) সরবরাহ করে। সুতরাং প্রধান UI উপাদান প্রবাহ "নিয়ন্ত্রণ" ব্যবহারকারীর প্রোগ্রাম থেকে UI কাঠামোর দিকে সরানো হয়। আগের দিনগুলিতে এটি ব্যবহারকারী প্রোগ্রামে ছিল।
উদাহরণ 2
CustomerProcessor
নীচের শ্রেণি বিবেচনা করুন :
class CustomerProcessor
{
SqlCustRepo custRepo = new SqlCustRepo();
private void processCustomers()
{
Customers[] custs = custRepo.getAllCusts();
}
}
যদি আমি যে processCustomer()
কোনও প্রয়োগের থেকে স্বতন্ত্র হতে চাই getAllCusts()
, তবে কেবল তার দ্বারা সরবরাহিত নয় SqlCustRepo
, আমাকে লাইন থেকে মুক্তি দিতে হবে: SqlCustRepo custRepo = new SqlCustRepo()
এবং এটিকে আরও সাধারণ কিছু দিয়ে প্রতিস্থাপন করতে হবে, যা বিভিন্ন ধরণের বাস্তবায়নের স্বীকৃতি দিতে সক্ষম, যেমন processCustomers()
সহজেই কাজ করবে যে কোনও সরবরাহকৃত বাস্তবায়ন। কোডের উপরে ( SqlCustRepo
মূল প্রোগ্রামের যুক্তিতে প্রয়োজনীয় ক্লাসটি ইনস্ট্যান্ট করে তোলা) একটি traditionalতিহ্যগত উপায় এবং এটি 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 পরিবর্তন করার প্রয়োজন হবে না।
ধারকটির উপরে (যা বসন্তের কাঠামো) এক্সএমএল ফাইল স্ক্যান করার, নির্দিষ্ট ধরণের শিমটি তাত্ক্ষণিকভাবে ব্যবহার করার এবং এটি ব্যবহারকারী প্রোগ্রামে ইনজেকশনের দায়িত্ব রয়েছে। কোন ক্লাসটি তাত্ক্ষণিকভাবে চালু করা হয়েছে তার উপরে ব্যবহারকারী প্রোগ্রামের কোনও নিয়ন্ত্রণ নেই।
পিএস: আইওসি জেনেরিক ধারণা এবং এটি বিভিন্ন উপায়ে অর্জিত হয়। উপরের উদাহরণগুলি নির্ভরতা ইনজেকশন দ্বারা এটি অর্জন করে।
তথ্যসূত্র: মার্টিন ফওলারের নিবন্ধ ।