JavaRush /Блоги Java /Random-TG /Баҳор. Дарси 2. IoC/DI дар амал
Umaralikhon
Сатҳи
Красноярск

Баҳор. Дарси 2. IoC/DI дар амал

Дар гурӯҳ нашр шудааст
Ва хамин тавр... Дар дарси гузашта мо кисми назариявии IoC ва DI-ро мухтасар дида баромадем. Мо инчунин файли конфигуратсияи pom.xml-ро барои лоиҳаи худ насб кардем. Имрӯз мо ба эҷоди қисми асосии барнома шурӯъ мекунем. Аввалан, ман ба шумо нишон медиҳам, ки чӣ гуна барномаро бидуни IoC / DI эҷод кунед. Ва он гоҳ мо мустақиман барномаеро эҷод мекунем, ки вобастагиҳоро мустақилона ҷорӣ мекунад. Яъне, назорати code ба дасти чаҳорчӯба мегузарад (ваҳшатангез садо медиҳад). Вақте ки мо барномаро идора мекунем, тасаввур кунед, ки як ширкати муайян вуҷуд дорад. Ва ширкат (ҳоло) ду шӯъба дорад: Шӯъбаи рушди Java ва киро. Бигзор синфе, ки "Шӯъбаи рушди Java" -ро тавсиф мекунад, ду усул дошта бошад: String getName() - баргардонидани номи корманд, String getJob() - баргардонидани мавқеи корманд. (Рӯйхати 1)
package org.example;

public class JavaDevelopment {

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

    public String getJob(){
        return "Middle Java developer";
    }
}
Бигзор синфе, ки шӯъбаи кирояро тавсиф мекунад, як конструктори воридкунанда дошта бошад, ки кормандро қабул мекунад ва усули void 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());
    }
}
Инчунин Main мавҷуд аст - синфе, ки ҳамаи шӯъбаҳоро идора мекунад. (Рӯйхати 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
Акнун биёед тасаввур кунем, ки ширкат хуб кор мекунад. Аз ин рӯ, онҳо тасмим гирифтанд, ки доираи фаъолияти худро васеъ кунанд ва шӯъбаи таҳияи Python кушоданд. Ва ин ҷо саволе ба миён меояд: Ин кафедраро дар сатҳи барнома чӣ гуна тавсиф кардан мумкин аст? Ҷавоб: ба шумо лозим аст, ки "нусхабардорӣ ва часбонед" дар ҳама ҷое, ки ин шӯъбаро тавсиф кардан лозим аст (усули хуби кӯҳна🙃). Аввалан, биёед худи синфро созем, ки он шӯъбаи "Pythonists" -ро тавсиф мекунад. (Рӯйхати 4)
package org.example;

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

    public String getJob(){
        return "Middle Python developer";
    }
}
Ва он гоҳ мо онро ба Департаменти Хиринг интиқол медиҳем. Ва HiringDepartment дар бораи ин шӯъба чизе намегӯяд. Аз ин рӯ, шумо бояд як an objectи нави синфи 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());
        }
    }
}
Чунон ки мебинем, хачми code ду баробар ва хатто аз ин хам зиёд шудааст. Бо миқдори зиёди code, хониши он коҳиш меёбад. Ва бадтарин чиз он аст, ки мо ҳама an objectҳоро дастӣ месозем ва синфҳое месозем, ки аз ҳамдигар хеле вобастаанд. Хуб, мо бо ин розӣ шудем. Онҳо танҳо як шӯъбаро тавсиф карданд. Мо аз ин чизеро аз даст намедиҳем. Хуб, агар шӯъбаи дигарро илова кунем-чӣ? Чӣ мешавад, агар ду бошад? Се? Аммо касе «кандан ва чаронидани чорво»-ро манъ накардааст. Баҳор.  Дарси 2. IoC / DI дар амал - 1 Бале, касе «Кану чарогод»-ро манъ накардааст, вале кордонй нест. Тыж барномасоз аст. Ва дар ин ҷо шумо метавонед DI-ро истифода баред. Яъне мо на дар сатҳи синф, балки дар сатҳи интерфейс кор хоҳем кард. Акнун ҳолати an objectҳои мо дар интерфейсҳо нигоҳ дошта мешаванд. Бо ин роҳ, вобастагӣ байни синфҳо ҳадди аққал хоҳад буд. Барои ин, мо аввал интерфейси рушдро эҷод мекунем, ки ду усули тавсифи кормандро дорад. (Рӯйхати 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 шумо метавонед танҳо an objectи интерфейси навъи Development -ро муайян кунед ва шумо инчунин метавонед чунин an objectро ба конструктор интиқол диҳед. (Рӯйхати 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());
    }
}
Чунон ки мебинем, микдори code кам шудааст. Ва муҳимтар аз ҳама, вобастагӣ ба ҳадди ақалл кам карда шуд. Чӣ тавр арзишҳо ва вобастагӣ барои ин an objectҳо амалӣ карда мешаванд? Се роҳи анҷом додани тазриқи вобастагӣ вуҷуд дорад:
  • Бо истифода аз конструктор
  • Истифодаи танзимкунандаҳо
  • Рангҳои худкор (пайванди худкор)
Амалисозӣ бо истифода аз конструктор Акнун биёед дар бораи татбиқ бо истифода аз конструктор сӯҳбат кунем. Ба Рӯйхати 9 нигаред. Созандаи синфи HiringDepartment an objectи навъи Developmentро ҳамчун вуруд интизор аст. Мо кӯшиш мекунем, ки вобастагиҳоро тавассути ин созанда ворид кунем. Инчунин бояд қайд кард, ки тазриқи вобастагӣ бо истифода аз контейнерҳои баҳорӣ анҷом дода мешавад. Се роҳи танзим кардани контейнерҳои Spring вуҷуд дорад:
  • Истифодаи файлҳои XML (Усули кӯҳна)
  • Истифодаи эзоҳҳо + файлҳои XML (тарзи муосир)
  • Истифодаи рамзи Java (роҳи муосир)
Ҳоло мо конфигуратсияро бо истифода аз файлҳои XML истифода мебарем. Сарфи назар аз он, ки ин усул кӯҳна ҳисобида мешавад, ҳоло ҳам бисёр лоиҳаҳо бо ин роҳ навишта мешаванд. Бинобар ин шумо бояд донед. Аввалан, шумо бояд дар ҷузвдони захираҳо файли xml эҷод кунед. Шумо метавонед ба он ҳар гуна ном диҳед, аммо беҳтараш маънои онро дорад. Ман онро "applicationContext.xml" номидаам. Баҳор.  Дарси 2. IoC / DI дар амал - 2 Дар ин файл мо порчаи codeи зеринро менависем (Рӯйхати 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>
Акнун, ба тартиб. Ҳашт сатри аввали code барои мо ҷолиб нест, онҳо пешфарз мебошанд. Шумо метавонед онҳоро танҳо нусхабардорӣ кунед. Tagи <bean> </bean> лӯбиёи баҳорро муайян мекунад. Лӯбиё an objectест, ки аз ҷониби контейнери Spring сохта ва идора карда мешавад. Бо ибораи оддӣ, худи контейнери Spring барои мо an objectи синфии нав эҷод мекунад (масалан: JavaDevelopment javaDevelopment = new JavaDevelopment();). Дар дохor ин тег атрибутҳои id ва синф мавҷуданд. id номи лӯбиёро муайян мекунад. Ин ID барои дастрасӣ ба an object истифода мешавад. Он ба номи an object дар синфи Java баробар аст. class - номи синферо, ки лӯбиёи мо (an object) ба он вобаста аст, муайян мекунад. Шумо бояд роҳи пурраи синфро муайян кунед. Диққат ба киро кардани лӯбиёи Департаменти. Дар дохor ин лӯбиё теги дигари <constructor-arg ref="javaDeveloper"/> мавҷуд аст. Дар ин ҷо тазриқи вобастагӣ рух медиҳад (дар ҳолати мо, сӯзандору бо истифода аз созанда). <constructor-arg> - ба Spring мегӯяд, ки контейнери Spring бояд вобастагиҳоро дар конструктори синф, ки дар атрибути bean муайян шудааст, ҷустуҷӯ кунад. Ва бо кадом an object бояд алоқаманд бошад, бо аттрибути ref , дар дохor теги <constructor-arg> муайян карда мешавад. ref - ID-и лӯбиёро барои тамос нишон медиҳад. Агар дар 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);
Нишон медиҳад, ки мо мехоҳем лӯбиёи (an object) синфи HiringDepartment гирем. Далели аввал ба ID-и лӯбиё ишора мекунад, ки мо дар файли xml навиштем. Далели дуюм ба синфе ишора мекунад, ки мо мехоҳем тамос гирем. Ин раванд инъикос номида мешавад .
hiringDepartment.displayInfo();
 context.close(); //Контекст всегда должен закрываться
Дар ин ҷо мо ба осонӣ усули синфи HiringDepartment-ро мегирем. Аҳамият диҳед, ки мо барои ба даст овардани an objectҳо калимаи навро истифода набурдаем ва дар ягон ҷо an objectҳои вобастаи навъи JavaDevelopment ё PythonDevelopmentро муайян накардаем. Онҳо танҳо дар файли applicationContext.xml тасвир шудаанд. Инчунин ба сатри охирин диққат диҳед. Шумо ҳамеша бояд пеш аз хомӯш кардани контекстро пӯшед. Дар акси ҳол, захираҳо озод карда намешаванд ва ихроҷи хотира ё кори нодурусти барнома метавонад рух диҳад. Агар шумо савол ё пешниҳод дошта бошед, дар шарҳҳо нависед, ман ҳатман ҷавоб медиҳам. Ташаккур барои таваҷҷӯҳ. Рамзи манбаъ дар истиноди My GitHub Cart мундариҷаи курси идома дорад...
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION