JavaRush /جاوا بلاگ /Random-SD /بهار. سبق 2. IoC/DI عملي طور تي
Umaralikhon
سطح
Красноярск

بهار. سبق 2. IoC/DI عملي طور تي

گروپ ۾ شايع ٿيل
۽ ائين... پوئين سبق ۾ اسان مختصر طور IoC ۽ DI جي نظرياتي حصي جو جائزو ورتو. اسان پنهنجي پروجيڪٽ لاءِ pom.xml configuration file پڻ سيٽ ڪيو. اڄ اسان پروگرام جو مکيه حصو ٺاهڻ شروع ڪريون ٿا. پهرين، مان توهان کي ڏيکاريندس ته IoC/DI کان سواءِ پروگرام ڪيئن ٺاهيو. ۽ پوء اسان سڌو سنئون هڪ پروگرام ٺاهينداسين جيڪو آزاد طور تي انحصار متعارف ڪرايو. اهو آهي، ڪوڊ جو ڪنٽرول فريم ورڪ جي هٿن ۾ گذري ٿو (آواز خوفناڪ). جڏهن اسان پروگرام کي منظم ڪري رهيا آهيون، تصور ڪريو ته اتي هڪ خاص ڪمپني آهي. ۽ ڪمپني (هاڻي لاءِ) وٽ ٻه شعبا آهن: جاوا ڊولپمينٽ ۽ هائرنگ ڊپارٽمينٽ. اچو ته "جاوا ڊولپمينٽ ڊپارٽمينٽ" جي وضاحت ڪندڙ طبقي جا ٻه طريقا آهن: String getName() - ملازم جو نالو واپس ڪرڻ، String getJob() - ملازم جي پوزيشن کي واپس ڪرڻ. (فهرست 1)
package org.example;

public class JavaDevelopment {

    public String getName(){
        return "Alexa";
    }

    public String getJob(){
        return "Middle Java developer";
    }
}
اچو ته ڪلاس بيان ڪري رهيو آهي نوڪرين واري کاتي کي هڪ ان پٽ تعمير ڪندڙ آهي جيڪو هڪ ملازم کي قبول ڪري ٿو، ۽ هڪ باطل displayInfo() طريقو جيڪو ملازمن بابت معلومات ڏيکاري ٿو. (فهرست 2)
package org.example;

public class HiringDepartment {
    private JavaDevelopment javaDevelopment;

    public HiringDepartment(JavaDevelopment javaDevelopment) {
        this.javaDevelopment = javaDevelopment;
    }

    public void displayInfo() {
        System.out.println("Name: " + javaDevelopment.getName());
        System.out.println("Job: " + javaDevelopment.getJob());
    }
}
هتي پڻ مکيه آهي - هڪ طبقو جيڪو سڀني شعبن کي منظم ڪري ٿو. (فهرست 3)
package org.example;

public class Main {
    public static void main(String ... args){
        JavaDevelopment javaDevelopment = new JavaDevelopment();
        HiringDepartment hiringDepartment = new HiringDepartment(javaDevelopment);

        hiringDepartment.displayInfo();
    }
}
في الحال استحڪام. جڏهن اسان مين ڪلاس کي هلائيندا آهيون ته اسان هيٺ ڏنل نتيجو حاصل ڪندا آهيون:
Name: Alexa
Job: Middle Java developer
هاڻي اچو ته تصور ڪريو ته ڪمپني عظيم ڪم ڪري رهي آهي. تنهن ڪري، انهن پنهنجي سرگرمين جي دائري کي وڌائڻ جو فيصلو ڪيو ۽ پٿون ڊولپمينٽ ڊپارٽمينٽ کوليو. ۽ هتي سوال پيدا ٿئي ٿو: پروگرام جي سطح تي هن اداري کي ڪيئن بيان ڪجي؟ جواب: توهان کي ضرورت آهي "ڪاپي ۽ پيسٽ" جتي توهان کي هن ڊپارٽمينٽ جي وضاحت ڪرڻ جي ضرورت آهي (سٺو پراڻو طريقو🙃). پهرين، اچو ته ڪلاس پاڻ ٺاهي، جيڪو "Pythonists" ڊپارٽمينٽ جي وضاحت ڪندو. (فهرست 4)
package org.example;

public class PythonDevelopment {
    public String getName(){
        return "Mike";
    }

    public String getJob(){
        return "Middle Python developer";
    }
}
۽ پوءِ اسان ان کي Hiring ڊپارٽمينٽ ڏانهن منتقل ڪنداسين. ۽ هائرنگ ڊپارٽمينٽ هن ڊپارٽمينٽ بابت ڪجهه به نٿو چوي. تنهن ڪري، توهان کي PythonDevelopment طبقي جو هڪ نئون اعتراض ٺاهڻو پوندو ۽ هڪ تعمير ڪندڙ جيڪو Python ڊولپرز کي قبول ڪري ٿو. توھان کي به تبديل ڪرڻو پوندو displayInfo() طريقو ته جيئن اھو معلومات صحيح نموني ڏيکاري. (فهرست 5)
package org.example;

public class HiringDepartment {
    private JavaDevelopment javaDevelopment;

    public HiringDepartment(JavaDevelopment javaDevelopment) {
        this.javaDevelopment = javaDevelopment;
    }


    //Тут создается отдел найма для Python - разработчиков
    private PythonDevelopment pythonDevelopment;

    public HiringDepartment(PythonDevelopment pythonDevelopment) {
        this.pythonDevelopment = pythonDevelopment;
    }

    //Тогда придется изменить метод displayInfo()
    public void displayInfo() {
        if(javaDevelopment != null) {
            System.out.println("Name: " + javaDevelopment.getName());
            System.out.println("Job: " + javaDevelopment.getJob());
        } else if (pythonDevelopment != null){
            System.out.println("Name: " + pythonDevelopment.getName());
            System.out.println("Job: " + pythonDevelopment.getJob());
        }
    }
}
جيئن اسان ڏسي سگهون ٿا، ڪوڊ جو مقدار ٻيڻو ٿي چڪو آهي، يا اڃا به وڌيڪ. ڪوڊ جي وڏي مقدار سان، ان جي پڙهڻ جي صلاحيت گھٽجي ٿي. ۽ بدترين شيء اها آهي ته اسان سڀني شين کي دستي طور تي ٺاهيو ۽ طبقن کي ٺاهيو جيڪي هڪ ٻئي تي انتهائي منحصر آهن. ٺيڪ، اسان هن سان اتفاق ڪيو. انهن صرف هڪ ڊپارٽمينٽ بيان ڪيو آهي. اسان ان مان ڪجھ به نه وڃايو. خير، جيڪڏهن اسان هڪ ٻيو ڊپارٽمينٽ شامل ڪيو؟ ڇا جيڪڏهن ٻه آهن؟ ٽي؟ پر ڪنهن به منع نه ڪئي ”کان کني ۽ چرڻ“. بهار.  سبق 2. IoC/DI عملي طور تي - 1 ها، ڪنهن به منع نه ڪئي آهي "مائن ۽ چراگاهه"، پر اهو پروفيشنل ناهي. Tyzh هڪ پروگرامر آهي. ۽ هتي توهان استعمال ڪري سگهو ٿا DI. اھو آھي، اسين ڪم ڪنداسين طبقاتي سطح تي نه، پر انٽرفيس جي سطح تي. هاڻي اسان جي شين جون حالتون انٽرفيس ۾ محفوظ ڪيون وينديون. هن طريقي سان، طبقن جي وچ ۾ انحصار گهٽ ۾ گهٽ ٿيندو. ائين ڪرڻ لاءِ، اسان پھريون ٺاھيون ٿا ڊولپمينٽ انٽرفيس، جنھن ۾ ملازم کي بيان ڪرڻ جا ٻه طريقا آھن. (فهرست 6)
package org.example;

public interface Development {
    String getName();
    String getJob();
}
اچو ته پوءِ ٻه طبقا JavaDevelopment ۽ PythonDevelopment ان انٽرفيس مان لاڳو (وارث) ڪريو ۽ طريقن کي ختم ڪريو String getName() ۽ String getJob(). (فهرست 7، 8)
package org.example;

public class JavaDevelopment implements Development {
    @Override
    public String getName(){
        return "Alexa";
    }

    @Override
    public String getJob(){
        return "Middle Java developer";
    }
}
package org.example;

public class PythonDevelopment implements Development {
    @Override
    public String getName(){
        return "Mike";
    }

    @Override
    public String getJob(){
        return "Middle Python developer";
    }
}
پوءِ HiringDepartment ڪلاس ۾ توھان آسانيءَ سان ڊولپمينٽ قسم جي ھڪڙي انٽرفيس شئي جي وضاحت ڪري سگھو ٿا ۽ توھان اھڙي اعتراض کي ٺاھيندڙ ڏانھن پڻ پاس ڪري سگھو ٿا. (فهرست 9)
package org.example;

public class HiringDepartment {
    private Development development; //Определяем интерфейс

    //Конструктор принимает an object интерфейса
    public HiringDepartment(Development development){
        this.development = development;
    }

    public void displayInfo(){
        System.out.println("Name: " + development.getName());
        System.out.println("Job: " + development.getJob());
    }
}
جيئن اسان ڏسي سگهون ٿا، ڪوڊ جو مقدار گھٽجي ويو آهي. ۽ سڀ کان وڌيڪ اهم، انحصار گهٽجي ويو. ڪئين قدر ۽ انحصار اصل ۾ انهن شين لاءِ لاڳو ڪيا ويا آهن؟ انحصار انجيڪشن ڪرڻ جا ٽي طريقا آهن:
  • تعمير ڪندڙ استعمال ڪندي
  • سيٽرز استعمال ڪندي
  • خودڪار وائرنگ (خودڪار پابند)
ڪنسٽرڪٽر استعمال ڪندي عمل ڪرڻ ھاڻي ڳالھيون ڪنسٽرڪٽر استعمال ڪرڻ تي. لسٽنگ کي ڏسو 9. Hiring ڊپارٽمينٽ ڪلاس جو ٺاھيندڙ ان پٽ جي طور تي ڊولپمينٽ قسم جي ھڪڙي شئي جي توقع ڪري ٿو. اسان هن تعمير ڪندڙ ذريعي انحصار کي انجڻ جي ڪوشش ڪنداسين. اهو پڻ قابل ذڪر آهي ته انحصار انجيڪشن نام نهاد اسپرنگ ڪنٽينرز استعمال ڪندي ڪيو ويندو آهي. بهار ڪنٽينرز کي ترتيب ڏيڻ جا ٽي طريقا آهن:
  • XML فائلون استعمال ڪندي (پراڻو طريقو)
  • تشريح استعمال ڪندي + XML فائلون (جديد طريقو)
  • جاوا ڪوڊ استعمال ڪندي (جديد طريقو)
اسان ھاڻي استعمال ڪري رھيا آھيون تشڪيل استعمال ڪندي XML فائلون. ان حقيقت جي باوجود ته هن طريقي کي پراڻي سمجهيو ويندو آهي، ڪيترائي منصوبا اڃا تائين هن طريقي سان لکيل آهن. تنهن ڪري توهان کي ڄاڻڻ جي ضرورت آهي. پهرين، توهان کي وسيلن فولڊر ۾ هڪ xml فائل ٺاهڻ گهرجي. توهان ان کي ڪو به نالو ڏئي سگهو ٿا، پر ترجيحي طور تي هڪ معني وارو. مون ان کي سڏيو "applicationContext.xml". بهار.  سبق 2. IoC/DI عملي طور تي - 2 هن فائل ۾ اسان ڪوڊ جو هيٺيون ٽڪرو لکنداسين (فهرست 10):
<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="javaDeveloper" class="org.example.JavaDevelopment"/>
    <bean id="pythonDeveloper" class="org.example.PythonDevelopment"/>

    <bean id="hiringDepartment" class="org.example.HiringDepartment">
        <constructor-arg ref="javaDeveloper"/>
    </bean>

</beans>
هاڻي، ترتيب ۾. ڪوڊ جون پھريون اٺ لائينون اسان لاءِ دلچسپ نه آھن، اھي ڊفالٽ آھن. توهان صرف ان کي نقل ڪري سگهو ٿا. <bean> </bean> ٽيگ بهار جي ٻوٽي جي وضاحت ڪري ٿو. هڪ لوبان هڪ اعتراض آهي جيڪو ٺاهي ۽ منظم ڪيو ويندو آهي اسپرنگ ڪنٽينر طرفان. سادي لفظن ۾، اسپرنگ ڪنٽينر پاڻ اسان لاءِ هڪ نئون ڪلاس شئي ٺاهي ٿو (مثال طور: JavaDevelopment javaDevelopment = نئون JavaDevelopment)؛). ھن ٽيگ جي اندر id ۽ class خاصيتون آھن. id ٻوٽي جو نالو بيان ڪري ٿو. هي id استعمال ڪيو ويندو اعتراض تائين رسائي ڪرڻ لاء. اهو جاوا ڪلاس ۾ هڪ اعتراض جي نالي جي برابر آهي. ڪلاس - ڪلاس جو نالو بيان ڪري ٿو جنهن سان اسان جي شين (شي) پابند آهي. توھان کي ڪلاس ڏانھن مڪمل رستو بيان ڪرڻ گھرجي. ڀرتي تي ڌيان ڏيو ڊپارٽمينٽ بين. ھن بين جي اندر ھڪڙو ٻيو <constructor-arg ref="javaDeveloper"/> ٽيگ آھي. اهو آهي جتي انحصار انجيڪشن ٿئي ٿي (اسان جي صورت ۾، هڪ تعمير ڪندڙ استعمال ڪندي انجڻ). <constructor-arg> - اسپرنگ کي ٻڌائي ٿو ته اسپرنگ ڪنٽينر کي ڪلاس ڪنسٽرڪٽر ۾ انحصار ڳولڻ گهرجي جنهن جي وضاحت bean خاصيت ۾ ڪئي وئي آهي. ۽ ڪهڙي شئي سان جڙيل هجڻ جي ضرورت آهي ref وصف طرفان طئي ڪيو ويو آهي ، اندر <constructor-arg> ٽيگ. ref - اشارو ڪري ٿو بين جي سڃاڻپ سان رابطو ڪرڻ لاء. جيڪڏهن ريف ۾ javaDeveloper جي بدران اسان id pythonDeveloper جي وضاحت ڪريون ٿا، پوء ڪنيڪشن PythonDevelopmen طبقي سان ٿئي ٿي. هاڻي اسان کي مکيه طبقي جي وضاحت ڪرڻ جي ضرورت آهي. اهو هن طرح نظر ايندو: (فهرست 11)
package org.example;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String ... args){
        //Определяем контекст файл в котором содержатся прописанные нами бины
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        //Получем бины, которые были определены в файле applicationContext.xml
        HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);

        hiringDepartment.displayInfo();

        context.close(); //Контекст всегда должен закрываться
    }
}
هتي ڇا آهي؟
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
هي لائن مين ڪلاس کي .xml فائل سان ڳنڍي ٿي جيڪا اسان جي بينز کي بيان ڪري ٿي. تعمير ڪندڙ کي منظور ڪيل قيمت .xml فائل جي نالي سان ملائڻ گهرجي. (اسان جي صورت ۾ applicationContext.xml).
HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);
اشارو ڪري ٿو ته اسان حاصل ڪرڻ چاهيون ٿا هڪ بين (آبجڪٽ) جي HiringDepartment طبقي جي. پهريون دليل بين جي سڃاڻپ ڏانهن اشارو ڪري ٿو جيڪو اسان xml فائل ۾ لکيو آهي. ٻيو دليل ڪلاس ڏانهن اشارو ڪري ٿو جنهن سان اسان رابطو ڪرڻ چاهيون ٿا. هن عمل کي Reflections سڏيو ويندو آهي .
hiringDepartment.displayInfo();
 context.close(); //Контекст всегда должен закрываться
هتي اسان آساني سان حاصل ڪريون ٿا هائرنگ ڊپارٽمينٽ ڪلاس جو طريقو. ياد رکو ته اسان نوان لفظ استعمال نه ڪيا آهن شيون حاصل ڪرڻ لاءِ، ۽ اسان ڪٿي به JavaDevelopment يا PythonDevelopment جي قسم جي منحصر شين جي وضاحت نه ڪئي آهي. اهي صرف applicationContext.xml فائل ۾ بيان ڪيا ويا. آخري لائن تي پڻ ڌيان ڏيو. توهان کي هميشه بند ڪرڻ کان پهريان حوالن کي بند ڪرڻ گهرجي. ٻي صورت ۾، وسيلن کي آزاد نه ڪيو ويندو، ۽ هڪ ميموري ليک يا پروگرام جي غلط آپريشن ٿي سگهي ٿي. جيڪڏهن توهان وٽ سوال يا تجويزون آهن، تبصرن ۾ لکندا، آئون ضرور جواب ڏيندس. توجه لاءِ مهرباني. لنڪ تي سورس ڪوڊ My GitHub Cart ڪورس مواد جاري رکڻ لاءِ...
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION