Inversion of Control and Dependency Injection: Part 2

এর আগের পোস্ট-এ ইনভার্সন অব কন্ট্রোল এবং ডিপেনডেন্সি ইনজেকশান এর ভেতরের কথা গুলো বলার চেষ্টা করেছি, এবার একটি উদাহরণ দেওয়া যাক।

এই উদাহরণটির জন্যে আমি স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করবো। আমি একটি ছোট্ট এপ্লিকেশান লিখেছি যার নাম টকার এপ, যে বিভিন্ন ভাষায় হ্যালোওয়ার্ল্ড বলতে পারে।  শুরুতে একটা ITalkable ইন্টারফেইস আছে যা একটি talk() মেথড এক্সপোজ করে।

package org.codexplo;

public interface ITalkable {
public void talk();
}

তারপর EnglishTalker এবং JapaniTalker  ক্লাস  Italkable  কে ইম্প্লিমেন্ট করে এবং তারা দুই ভাষায় কথা বলে।

package org.codexplo;

public class EnglishTalker implements ITalkable {

@Override
public void talk() {
System.out.println("Hello world");
}
}

 

package org.codexplo;

public class JapaniTalker implements ITalkable {

@Override
public void talk() {
System.out.println("こんにちは、世界");
}
}

এখন মনে করি আমাদের একটি TalkerService আছে যে নির্ধারণ করে দেয় এই মুহূর্তে আমাদের এপ কোন টকারটি ব্যবহার করবে। আমাদের TalkerService এ একটি মেথড আছে, sayHelloworld() এবং এর উপরে একটি ITalkable এর রেফারেন্স আছে, যেখানে আমরা সরাসরি এর  এর ইনসটেন্স ক্রিয়েট করেছি।

package org.codexplo;

public class TalkerService {
private ITalkable talkable = new EnglishTalker();

public void sayHelloworld() {
talkable.talk();
}
}

এখন আমরা আমাদের মেইন এপটা লিখি ।

package org.codexplo;

public class TalkerApp {
public static void main(String[] args) {
TalkerService talkerService = new TalkerService();
talkerService.sayHelloworld();
}
}

এখন আমরা একটু ক্লাস ডায়াগ্রাম দেখি।

আমরা খুব সহজেই দেখতে পারছি, আমাদের সিস্টেম খুব টাইটলি কাপল্ড। কারণ আমরা কোন ভাষায় হ্যালো ওয়াল্ড বলবো আমাদেরকে হার্ড কোড করে বলে দিতে হচ্ছে প্রতিবার।

যেহেতু আমাদের উদ্দেশ্য একটি লুজলি কাপলড সিস্টেম তৈরি করা, এখন দেখি কিভাবে এই জিনিসটি ইনভার্সন অব কন্ট্রোল ব্যবহার করে করা যায়। স্প্রিং ফ্রেমওয়ার্ক একটি একটি কনটেইনার প্রোভাইড করে কম্পোনেন্ট ম্যনেজ করার জন্যে। আমরা এগুলো আগের পোস্টে বলেছি। আমরা আমাদের TalkerService টাকে একটু পরিবর্তন করি।

package org.codexplo;

public class TalkerService {
private ITalkable talkable;

public void setTalkable(ITalkable talkable) {
this.talkable = talkable;
}

public void sayHelloworld() {
talkable.talk();
}
}

আমরা এখনে সরাসরি অবজেক্ট ক্রিয়েট না করে একটি সেটার ইনজেকশান ব্যবহার করেছি। অবজেক্ট ক্রিয়েট এর কাজটি ছেড়ে দিলাম কনটেইনার এর কাছে। এই TalkerService কখনোই  ITalkable এর ইম্প্লিমেন্টেশানের এর অবজেক্ট ক্রিয়েট করবে না, বরং তাকে তা প্রভাইড করা হবে। অর্থাৎ সে রানটাইমে জেনে যাবে তাকে কোন ভাষায় কথা বলতে হবে।

এখন একটু ক্লাস ডায়াগ্রাম দেখি।

এখন সিস্টেম অনেক লোজলি কাপল্ড। এখানে সেটার ইনজেকশান ব্যবহার করা হয়েছে।

এই কাজটি করতে হলে আমাদের কে একটি কনফিগারেশান ফাইল মেইনটেইন করতে হয়

<!--?<span class="hiddenSpellError" pre=""-->xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" >

<bean
id="englishTalker"
>
<!--<span class="hiddenSpellError" pre=""-->bean>
<bean
id="japaniTalker"
>
</bean>

<bean
id="talkerService"
>
<property name="talkable" >
<ref local="englishTalker" />
</property>
</bean>
</beans>

আর আমাদের মেইনএপ ক্লাসটি দেখতে এখন হবে …

</pre>
package org.codexplo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IOCTalkerApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"beans.xml");
TalkerService talkerService = (TalkerService) context
.getBean("talkerService");
talkerService.sayHelloworld();
}
}
<pre>

এই প্রোগ্রামটি রান করতে তোমার যা যা লাগবে

antlr-runtime-3.0.jar
commons-logging-1.0.4.jar
org.springframework.asm-3.0.0.M3.jar
org.springframework.beans-3.0.0.M3.jar
org.springframework.context-3.0.0.M3.jar
org.springframework.context.support-3.0.0.M3.jar
org.springframework.core-3.0.0.M3.jar
org.springframework.expression-3.0.0.M3.jar

এই যারগুলো ক্লাসপাথ এ এড করতে হবে।

ডাউনলোড: Full Source & Libs

Advertisements

8 Comments

  1. খুব সুন্দর করে বুঝিয়েছিস। কিন্তু এখানে Container Provide করছে Spring.
    আমার ঐ লুজলি কাপলড ডায়াগ্রাম পর্যন্ত সহজ লেগেছে। একটা কি Container নিজে বানিয়ে দেখানো সম্ভব?

    1. defiantly বানানো সম্ভব, কিন্তু জিনিসটি খুব বেশি সহজ হবে না, তাছাড়া অনেক ভাল ভাল Container বানানোই আছে, গুগুল গুইস আমরা যেকোন প্রজেক্টের জন্যে ব্যবহার করতে পারি। ডট নেটের জন্যে ninject সবচেয়ে ভাল। আমি ninject ব্যবহার করি।

  2. vai j xml config ta dsen oita to mone hoi sudhu { englishTalker } -e hobe i mean English-e kotha bolbe ….. Japani to bolbe na… Main App theke ami kivabe set korbo english naki Japani talker… r ta jodi set na kora lage tahole Service kmne bujhbe j take kokhon kon vasai kotha bolte hobe?

    1. yes! when you need JapaniTalker , you just inject it and it will work, you no need to create new object in the service, instead, you are just injecting dependency through configuration. You service class is always clean and work without any modification .. what so ever.

      1. vaiya jtuku bujechi tate inject ta bean config-e-e korte hobe to ami ki upnar xml code snap-er 21 number line-er niche airokom kikhbo

        naiki nicher airokom likhbo

        <bean id="talkerService" >
            <property name="talkable">
                <ref local="englishTalker"/>
                <ref local="japaniTalker"/>
            </property>
        

        and upor-er jkono ek rokom-e hok na keno… ‘talkerService’ kmne bujhbe kokhon kon vasai kotha bolte hobe… tar to confused howar kotha se jane j se 2ta vasa-e pare but kokhon konta bolte hobe sei jinish ta kon point-e kmne decision nibe?

  3. Dependency Injection এত কঠিন করে বুঝা লাগে ??

    $b = new B(new A());

    A is a dependency of B, and A was injected into B.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s