JavaRush /Blog Jawa /Random-JV /Spring. Pawulangan 2. IoC / DI ing laku
Umaralikhon
tingkat
Красноярск

Spring. Pawulangan 2. IoC / DI ing laku

Diterbitake ing grup
Dadi ... Ing pawulangan sadurunge, kita nyemak babagan teoritis babagan IoC lan DI. Kita uga nyiyapake file konfigurasi pom.xml kanggo proyek kita. Dina iki kita miwiti nggawe bagean utama program. Pisanan, aku bakal nuduhake sampeyan carane nggawe program tanpa IoC / DI. Banjur kita bakal langsung nggawe program sing independen ngenalake dependensi. Sing, kontrol kode liwat menyang tangan saka framework (swara serem). Nalika kita ngatur program, mbayangno yen ana perusahaan tartamtu. Lan perusahaan (saiki) duwe rong departemen: Departemen Pengembangan lan Penggajian Jawa. Ayo kelas sing njlèntrèhaké "Departemen Pembangunan Jawa" duwe rong cara: String getName () - bali jeneng pegawe, String getJob () - bali posisi pegawe. (Daftar 1)
package org.example;

public class JavaDevelopment {

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

    public String getJob(){
        return "Middle Java developer";
    }
}
Ayo kelas njlèntrèhaké departemen hiring duwe konstruktor input sing nampa pegawe, lan roso sepi cara displayInfo () sing nampilake informasi bab karyawan. (Daftar 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());
    }
}
Ana uga Utama - kelas sing ngatur kabeh departemen. (Daftar 3)
package org.example;

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

        hiringDepartment.displayInfo();
    }
}
Stabilitas kanggo saiki. Nalika kita mbukak kelas Utama kita entuk asil ing ngisor iki:
Name: Alexa
Job: Middle Java developer
Saiki ayo bayangake manawa perusahaan kasebut apik banget. Mulane, padha mutusaké kanggo nggedhekake orane katrangan saka aktivitas lan mbukak departemen pembangunan Python. Lan ing kene ana pitakonan: Carane njlèntrèhaké departemen iki ing tingkat program? Wangsulan: Sampeyan kudu "nyalin lan nempel" ing ngendi wae sampeyan kudu njlèntrèhaké departemen iki (cara lawas sing apik🙃). Pisanan, ayo nggawe kelas kasebut dhewe, sing bakal nggambarake departemen "Pythonists". (Daftar 4)
package org.example;

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

    public String getJob(){
        return "Middle Python developer";
    }
}
Banjur kita bakal nransfer menyang HiringDepartment. Lan HiringDepartment ngandika apa-apa bab departemen iki. Mulane, sampeyan kudu nggawe obyek anyar saka kelas PythonDevelopment lan konstruktor sing nampa pangembang Python. Sampeyan uga kudu ngganti cara displayInfo () supaya bisa nampilake informasi kanthi bener. (Daftar 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());
        }
    }
}
Minangka kita bisa ndeleng, volume kode wis tikel kaping pindho, utawa malah luwih. Kanthi jumlah kode sing akeh, keterbacaane suda. Lan sing paling awon yaiku nggawe kabeh obyek kanthi manual lan nggawe kelas sing gumantung banget. Ok, kita setuju karo iki. Dheweke mung nggambarake siji departemen. Kita ora bakal kelangan apa-apa saka iki. Nah, yen kita nambah departemen liyane? Apa yen ana loro? telu? Nanging ora ana sing nglarang "tambang lan angonan". Spring.  Pawulangan 2. IoC / DI ing laku - 1 Ya, ora ana sing nglarang "Mine and Pasture", nanging ora profesional. Tyzh minangka programmer. Lan ing kene sampeyan bisa nggunakake DI. Sing, kita bakal bisa ora ing tingkat kelas, nanging ing tingkat antarmuka. Saiki negara obyek kita bakal disimpen ing antarmuka. Kanthi cara iki, dependensi antarane kelas bakal minimal. Kanggo nindakake iki, kita nggawe antarmuka Pangembangan, sing duwe rong cara kanggo nggambarake karyawan. (Daftar 6)
package org.example;

public interface Development {
    String getName();
    String getJob();
}
Ayo banjur loro kelas JavaDevelopment lan PythonDevelopment ngleksanakake (warisan) saka antarmuka iki lan ngganti cara String getName () lan String getJob (). (Daftar 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";
    }
}
Banjur ing kelas HiringDepartment sampeyan mung bisa nemtokake obyek antarmuka saka jinis Development lan sampeyan uga bisa ngirim obyek kasebut menyang konstruktor. (Daftar 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());
    }
}
Minangka kita bisa ndeleng, jumlah kode wis suda. Lan sing paling penting, dependensi diminimalisir. Kepiye nilai-nilai lan dependensi sing ditindakake kanggo obyek kasebut? Ana telung cara kanggo nindakake injeksi dependensi:
  • Nggunakake konstruktor
  • Nggunakake setter
  • Autowiring (pengikat otomatis)
Implementasi nggunakake konstruktor Saiki ayo ngomong babagan implementasine nggunakake konstruktor. Deleng ing Listing 9. Konstruktor saka kelas HiringDepartment ngarepake obyek saka jinis Development minangka input. Kita bakal nyoba nyuntikake dependensi liwat konstruktor iki. Sampeyan uga kudu dicathet yen injeksi dependensi ditindakake kanthi nggunakake kontaner Spring. Ana telung cara kanggo ngatur kontaner Spring:
  • Nggunakake file XML (metode lawas)
  • Nggunakake anotasi + file XML (Cara modern)
  • Nggunakake kode Jawa (cara modern)
Saiki kita nggunakake konfigurasi nggunakake file XML. Senadyan kasunyatan manawa cara iki dianggep ketinggalan jaman, akeh proyek sing isih ditulis kanthi cara iki. Mulane sampeyan kudu ngerti. Pisanan, sampeyan kudu nggawe file xml ing folder sumber daya. Sampeyan bisa menehi jeneng apa wae, nanging luwih becik jeneng sing migunani. Aku disebut "applicationContext.xml". Spring.  Pawulangan 2. IoC / DI ing laku - 2 Ing file iki kita bakal nulis potongan kode ing ngisor iki (Listing 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>
Saiki, supaya. Wolung baris pisanan kode ora menarik kanggo kita, iku standar. Sampeyan mung bisa nyalin. Tag <bean> </bean> nemtokake Spring bean. Kacang buncis minangka obyek sing digawe lan dikelola dening wadhah Spring. Ing tembung prasaja, wadhah Spring dhewe nggawe obyek kelas anyar kanggo kita (contone: JavaDevelopment javaDevelopment = JavaDevelopment anyar ();). Ing njero tag iki ana atribut id lan kelas. id nemtokake jeneng kacang. Id iki bakal digunakake kanggo ngakses obyek kasebut. Iku padha karo jeneng obyek ing kelas Jawa. kelas - nemtokake jeneng kelas sing kacang kita (obyek) kaiket. Sampeyan kudu nemtokake path lengkap menyang kelas. Pay manungsa waé menyang hiringDepartment kacang buncis. Ing jero kacang iki ana tag <constructor-arg ref="javaDeveloper"/> liyane. Ing kene ana injeksi dependensi (ing kasus kita, injeksi nggunakake konstruktor). <constructor-arg> - ngandhani Spring yen wadhah Spring kudu nggoleki dependensi ing konstruktor kelas sing ditetepake ing atribut kacang. Lan obyek sing kudu digandhengake ditemtokake dening atribut ref , ing tag <constructor-arg>. ref - nuduhake id saka kacang kontak. Yen ing ref tinimbang javaDeveloper kita nemtokake id pythonDeveloper, banjur sambungan ana karo kelas PythonDevelopmen. Saiki kita kudu njlèntrèhaké kelas utama. Bakal katon kaya iki: (Listing11)
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(); //Контекст всегда должен закрываться
    }
}
ono opo neng kene?
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Baris iki ngubungake kelas Utama menyang file .xml sing nggambarake kacang buncis kita. Nilai liwati kanggo konstruktor kudu cocog jeneng file .xml. (Ing kasus kita applicationContext.xml).
HiringDepartment hiringDepartment = context.getBean("hiringDepartment", HiringDepartment.class);
Nuduhake yen kita pengin entuk kacang (obyek) saka kelas HiringDepartment. Argumentasi pisanan nuduhake id kacang sing kita tulis ing file xml. Argumentasi kapindho nuduhake kelas sing arep kita hubungi. Proses iki diarani refleksi .
hiringDepartment.displayInfo();
 context.close(); //Контекст всегда должен закрываться
Ing kene kita gampang entuk metode kelas HiringDepartment. Elinga yen kita ora nggunakake tembung kunci anyar kanggo njupuk obyek, lan kita ora nemtokake obyek gumantung saka jinis JavaDevelopment utawa PythonDevelopment ngendi wae. Padha mung diterangake ing file applicationContext.xml. Uga mbayar manungsa waé menyang baris pungkasan. Sampeyan kudu tansah nutup konteks sadurunge mateni. Yen ora, sumber daya ora bakal dibebasake, lan kebocoran memori utawa operasi program sing ora bener bisa kedadeyan. Yen sampeyan duwe pitakon utawa saran, tulis ing komentar, aku mesthi bakal mangsuli. Matur nuwun kanggo perhatian. Kode sumber ing tautan Konten Kursus Gerobak GitHubku Diterusake ...
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION