JavaRush /Java Blog /Random-TK /Bahar. Sapak 2. IoC / DI iş ýüzünde
Umaralikhon
Dereje
Красноярск

Bahar. Sapak 2. IoC / DI iş ýüzünde

Toparda çap edildi
Şeýdip ... Öňki sapakda IoC we DI-iň nazary bölegini gysgaça gözden geçirdik. Taslamamyz üçin pom.xml konfigurasiýa faýlyny hem gurduk. Bu gün programmanyň esasy bölegini döredip başlaýarys. Ilki bilen, IoC / DI bolmazdan nädip programma döredip boljakdygyny görkezerin. Soň bolsa garaşlylygy özbaşdak girizýän bir programma dörederis. Codeagny, kody dolandyrmak çarçuwanyň eline geçýär (gykylykly sesler). Programmany dolandyrýarkak, belli bir kompaniýanyň bardygyny göz öňüne getiriň. Kompaniýanyň (häzirlikçe) iki bölümi bar: Java Ösüş we Işe almak bölümi. “Java Ösüş Bölümini” beýan edýän synpyň iki usuly bolsun: String getName () - işgäriň adyny yzyna gaýtarmak, String getJob () - işgäriň ýagdaýyny yzyna gaýtarmak. (Sanaw 1)
package org.example;

public class JavaDevelopment {

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

    public String getJob(){
        return "Middle Java developer";
    }
}
Işe alýan bölümi suratlandyrýan synpda işgäri kabul edýän giriş konstruktory we işgärler hakda maglumatlary görkezýän boş displeýInfo () usuly bolsun. (2-nji sanaw)
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());
    }
}
Şeýle hem “Main” - ähli bölümleri dolandyrýan synp bar. (3-nji sanaw)
package org.example;

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

        hiringDepartment.displayInfo();
    }
}
Häzirlikçe durnuklylyk. Esasy synpy işledenimizde aşakdaky netijäni alarys:
Name: Alexa
Job: Middle Java developer
Indi kompaniýanyň ajaýyp iş edýändigini göz öňüne getireliň. Şonuň üçin işleriniň gerimini giňeltmek kararyna geldiler we Python ösüş bölümini açdylar. Ine, şu ýerde bir sorag ýüze çykýar: Bu bölümi programma derejesinde nädip suratlandyrmaly? Jogap: Bu bölümi (gowy köne usul) suratlandyrmak üçin nirede gerek bolsa "göçürip almaly". Ilki bilen, "Pythonistler" bölümini suratlandyrjak synpyň özi döredeliň. (4-nji sanaw)
package org.example;

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

    public String getJob(){
        return "Middle Python developer";
    }
}
Soň bolsa ony “HiringDepartment” -e geçireris. “HiringDepartment” bu bölüm hakda hiç zat diýmeýär. Şonuň üçin PythonDevelopment synpynyň täze obýektini we Python döredijilerini kabul edýän konstruktor döretmeli bolarsyňyz. Şeýle hem, displeýInfo () usulyny maglumatlary dogry görkezmegi üçin üýtgetmeli bolarsyňyz. (5-nji sanaw)
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());
        }
    }
}
Görşümiz ýaly, koduň göwrümi iki esse artdy, hatda ondanam köp. Kodyň köp mukdary bilen onuň okalmagy peselýär. Iň erbet tarapy, ähli obýektleri el bilen döredýäris we biri-birine gaty bagly sapaklary edýäris. Bolýar, biz muňa razy bolduk. Diňe bir bölümi suratlandyrdylar. Mundan hiç zat ýitirmeris. Başga bir bölüm goşsak näme etmeli? Iki bar bolsa näme etmeli? Üç? Emma hiç kim “magdan gazmagy we bakmagy gadagan etmedi. Bahar.  Sapak 2. IoC / DI iş ýüzünde - 1 Hawa, hiç kim “Mina we öri meýdanlaryny” gadagan etmedi, ýöne bu professional däl. Tyzh programmist. Bu ýerde DI ulanyp bilersiňiz. .Agny, synp derejesinde däl-de, interfeýs derejesinde işläris. Indi obýektlerimiziň ýagdaýy interfeýslerde saklanar. Şeýlelik bilen, synplaryň arasyndaky garaşlylyk az bolar. Munuň üçin ilki bilen işgäri suratlandyrmagyň iki usuly bolan Ösüş interfeýsini döredýäris. (6-njy sanaw)
package org.example;

public interface Development {
    String getName();
    String getJob();
}
Soňra iki synp JavaDevelopment we PythonDevelopment bu interfeýsden durmuşa geçsin (miras alar) we String getName () we String getJob () usullaryny ýok edeliň. (7, 8 sanawy)
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";
    }
}
Soňra “HiringDepartment” synpynda Ösüş görnüşiniň interfeýs obýektini kesgitläp bilersiňiz we şeýle obýekti konstruktora geçirip bilersiňiz. (9-njy sanaw)
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());
    }
}
Görşümiz ýaly koduň mukdary azaldy. Iň esasy zat, garaşlylyklar azaldyldy. Bu obýektler üçin gymmatlyklar we garaşlylyklar hakykatda nähili amala aşyrylýar? Baglylyk sanjymynyň üç usuly bar:
  • Konstruktory ulanmak
  • Sazlaýjylary ulanmak
  • Awtomatiki usulda (awtomatiki baglanyşyk)
Konstruktor ulanyp durmuşa geçirmek Indi geliň, konstruktor ulanyp durmuşa geçirmek barada gürleşeliň. Sanawyň 9-a serediň. “HiringDepartment” synpynyň konstruktory, giriş görnüşi hökmünde Ösüş obýektine garaşýar. Bu konstruktoryň üsti bilen garaşlylygy sanamaga synanyşarys. Baglylyk sanjymynyň “Bahar” konteýnerleri arkaly ýerine ýetirilýändigini hem bellemelidiris. Bahar gaplaryny sazlamagyň üç usuly bar:
  • XML faýllaryny ulanmak (Könelişen usul)
  • Annotasiýa + XML faýllaryny ulanmak (Häzirki zaman usuly)
  • Java koduny ulanmak (Häzirki zaman usuly)
Indi konfigurasiýany XML faýllaryny ulanýarys. Bu usulyň köne hasaplanandygyna garamazdan, köp taslamalar henizem şeýle ýazylýar. Şonuň üçin bilmeli. Ilki bilen, çeşmeler bukjasynda xml faýly döretmeli. Islän atyňyzy berip bilersiňiz, ýöne has gowusy manyly. Men oňa "applicationContext.xml" diýdim. Bahar.  Sapak 2. IoC / DI iş ýüzünde - 2 Bu faýlda aşakdaky kod ýazarys (10-njy sanaw):
<?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>
Indi tertipde. Ilkinji sekiz setir kod biziň üçin gyzykly däl, olar asyl. Olary diňe göçürip bilersiňiz. <bean> </bean> belligi Bahar noýbasyny kesgitleýär. Noýba, Bahar konteýner tarapyndan döredilen we dolandyrylýan bir zat. Simpleönekeý sözler bilen aýdylanda, Bahar konteýneriniň özi biziň üçin täze synp obýektini döredýär (mysal üçin: JavaDevelopment javaDevelopment = täze JavaDevelopment ();). Bu belligiň içinde id we synp atributlary bar. id noýba adyny görkezýär. Bu ID obýekte girmek üçin ulanylar. Java synpynda bir obýektiň adyna deňdir. synp - noýba (obýekt) bagly bolan synpyň adyny kesgitleýär. Synpyň doly ýoluny görkezmeli. Işe alýan bölüm noýbasyna üns beriň. Bu noýbanyň içinde başga bir <konstruktor-arg ref = "javaDeveloper" /> belligi bar. Bu ýerde garaşlylyk sanjymynyň ýüze çykýan ýeri (biziň ýagdaýymyzda, konstruktor ulanyp sanjym). <constructor-arg> - Bahara konteýneriň noýba atributynda kesgitlenen synp konstruktoryna garaşlylygy gözlemelidigini aýdýar. Haýsy obýekt bilen baglanyşmaly bolsa , <constructor-arg> belliginiň içinde ref atributy bilen kesgitlenýär. ref - habarlaşmak üçin noýbanyň idini görkezýär. JavaDeveloper ýerine ref pythonDeveloper kesgitlesek, baglanyşyk PythonDevelopmen synpy bilen ýüze çykýar. Indi esasy synpy suratlandyrmalydyrys. Bu şeýle bolar: (Sanaw 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(); //Контекст всегда должен закрываться
    }
}
Bu ýerde näme?
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Bu setir, esasy synpy noýbalarymyzy suratlandyrýan .xml faýly bilen baglanyşdyrýar. Konstruktora geçen baha .xml faýlyň adyna laýyk gelmelidir. (Biziň üçin programmaContext.xml).
HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);
“HiringDepartment” synpynyň noýbasyny (obýektini) almak isleýändigimizi görkezýär. Ilkinji argument, xml faýlynda ýazan noýba idimizi görkezýär. Ikinji argument, biziň habarlaşmak isleýän synpymyza yşarat edýär. Bu prosese şöhlelendirme diýilýär .
hiringDepartment.displayInfo();
 context.close(); //Контекст всегда должен закрываться
Bu ýerde “HiringDepartment” synpynyň usulyny aňsatlyk bilen alýarys. Obýektleri almak üçin täze açar söz ulanmaýandygymyzy we JavaDevelopment ýa-da PythonDevelopment görnüşli garaşly obýektleri kesgitlemändigimize üns beriň. Olary diňe “ApplicationContext.xml” faýlynda beýan etdiler. Soňky setire hem üns beriň. Öçürmezden ozal konteksti ýapmaly. Otherwiseogsam, çeşmeler boşadylmaz we ýadyň syzmagy ýa-da programmanyň nädogry işlemegi bolup biler. Soraglaryňyz ýa-da teklipleriňiz bar bolsa teswirlerde ýazyň, hökman jogap bererin. Üns bereniňiz üçin sag boluň. Salgydaky çeşme kody My GitHub Cart Course mazmuny Dowam etmek üçin ...
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION