Kun riippuvuuden ratkaisun tekee ulkoinen agentti eikä itse luokka, sitä kutsutaan riippuvuusinjektioksi. Spring-kehyksessä tuetaan kahta vakiotapaa riippuvuuden lisäämiseen, konstruktoriargumentin tai setter-menetelmän avulla. Edellinen riippuvuusinjektiotyyppi tunnetaan rakentajainjektiona ja jälkimmäinen setteriinjektio. Molempia menetelmiä käytetään eri tarkoituksiin ja niillä on omat hyvät ja huonot puolensa.
Rakentajan ruiskutus vs. setteriinjektio
Ero konstruktoriinjektion ja asettajan injektion välillä on se, että rakentajainjektio käyttää konstruktoria, ja toisaalta setteriinjektio käyttää setterimenetelmiä riippuvuuden lisäämiseen. Nämä kaksi injektiotapoja eroavat toisistaan useiden parametrien, kuten turvallisuuden, luettavuuden, tuen muuttumattomuuden ja niin edelleen, perusteella.
Konstruktoriinjektio on eräänlainen riippuvuuden lisäys jousikehyksessä, joka käyttää konstruktoria riippuvuuden lisäämiseen. Jollekin luokalle vaadittavat riippuvuudet määritetään kyseisen luokan rakentajan parametreiksi. Konstruktoriinjektio ei salli kehittäjän rakentaa mitään objektia, elleivät kaikki riippuvuudet ole valmiita, ja siten se varmistaa onnistuneen riippuvuuden lisäyksen.
Setter-injektio on eräänlainen riippuvuusinjektio jousikehyksessä, joka käyttää setterimenetelmiä riippuvuuden lisäämiseen. Siinä on setter-menetelmät muodossa setXXX(), jossa XXX tarkoittaa riippuvuutta, joka lisää riippuvaiset objektit asiakkaaseen. Tämä tapa ratkaista riippuvuus on hyvin yleinen kevään viitekehyksessä.
Vertailutaulukko konstruktoriinjektion ja setterin injektion välillä
Vertailuparametrit | Rakentajan ruiskutus | Setter-injektio |
Riippuvuus ruiskeena | Se käyttää konstruktoria. | Se käyttää setterimenetelmiä. |
Luettavuus | Se ei ole paljon luettavissa setteriin verrattuna. | Se on luettavampi. |
Ohita ominaisuus | Riippuvuutta ei voi ohittaa. | Voi ohittaa tietyt riippuvuudet. |
Muutokset | Se luo aina uuden papu-instanssin. | Se ei luo uutta papu-instanssia. |
Muuttumattomuus | Se tukee muuttumattomuutta. | Se ei tue. |
Mikä on konstruktoriinjektio?
Konstruktoriinjektio on yksi tavallisista tavoista ratkaista riippuvuus Spring-kehyksessä, joka määrittää staattisesti luokille vaadittavat riippuvuudet asettamalla ne parametreiksi luokan rakentajalle. Kaikissa luokissa, jotka vaativat riippuvuutta, tulee olla sisällään julkinen konstruktori, joka ottaa instanssin konstruktoriargumenttina ja tämän konstruktorin tulee välttämättä olla ainoa julkinen konstruktori luokan sisällä.
Jos tarvitaan useampi kuin yksi riippuvuus, lisäargumentit tulee lisätä samaan konstruktoriin. Sen varmistamiseksi, että riippuvuus ruiskutetaan kokonaan, tulee noudattaa yhden vastuun periaatetta, jonka mukaan jäsenten tulee tehdä vain yksi asia. Konstruktori tulee pitää vapaana kaikesta muusta logiikasta, jotta luokkien rakentaja olisi nopeampi ja luotettavampi.
Yksi tärkeä seikka konstruktoriinjektiossa on, että objekteja ei rakenneta, elleivät kaikki riippuvuudet ole valmiita. Koska se luo uusia ilmentymiä aina kun konstruktoria kutsutaan, ohittaminen ei ole siinä mahdollista. Konstruktoriinjektiota käytetään periaatteessa tapauksissa, joissa on tarve luoda objekteja kaikilla riippuvuuksilla. Tämä on yleisin ja helpoin tapa toteuttaa riippuvuudet oikein.
Mikä on Setter-injektio?
Setter-injektio on yksi tavallisista tavoista ratkaista riippuvuus Spring-kehyksessä, joka käyttää setter-menetelmiä riippuvuuksien ratkaisemiseen. Asetusmenetelmät ovat muotoa setXXX(), jossa XXX määrittää riippuvuuden, joka on lisättävä. Tämän tyyppisessä injektiomenetelmässä ensin luodaan objekti ja myöhemmin lisätään riippuvuus. Springin määrittämiseen käytetään XML-tiedostoja, joten luettavuus on suuri huolenaihe.
Koska setterimenetelmillä on tietyn muotoinen menetelmänimien muoto, se parantaa luettavuutta monin tavoin. Kun on tarve injektoida suurempi määrä riippuvuuksia, niin setter-injektiotyyppi on erittäin suosittu ja suositeltavampi kuin muun tyyppinen injektiomenetelmä. Lisäksi setter-injektion avulla kehittäjät voivat helposti ohittaa ja muuttaa arvoja, koska se ei luo uutta papu-instanssia joka kerta. Asetusinjektion ainoa haittapuoli on, että se ei takaa täydellistä riippuvuusinjektiota.
Ei ole takeita siitä, onko tiettyyn esineeseen injektoitu riippuvuus vai ei. Toisin sanoen se tarkoittaa, että voi olla objekti, jolla on epätäydellinen riippuvuus. Setter-injektio on joustavin ja yleisin tapa toteuttaa riippuvuusinjektio.
Tärkeimmät erot konstruktoriinjektion ja setteriinjektion välillä
Johtopäätös
Tärkeintä on, että molemmilla tavoilla lisätä riippuvuuksia, olkoon se joko rakentajainjektio tai asettajainjektio, on omat hyvät ja huonot puolensa. Tämän lisäksi Spring ei estä kehittäjiä käyttämästä ketään muuta kuin arvioijaa. He voivat käyttää vapaasti sekä konstruktoriinjektiota että setteriinjektiota yhdessä Spring-konfiguraatiotiedostossa. Tärkeä asia, joka on pidettävä mielessä riippuvuutta lisättäessä, on käyttää konstruktoriinjektiota, kun on pakko luoda objekteja, joissa on kaikki riippuvuudet, ja käyttää setter-injektiota, kun riippuvuuksia on enemmän tai jos tarvitaan parempaa luettavuus.
Viitteet
- https://digitalcommons.calpoly.edu/csse_fac/34/
- https://books.google.com/books?hl=fi&lr=&id=InfRDwAAQBAJ&oi=fnd&pg=PA63&dq=constructor+injection&ots=Hon_bCw-Kv&sig=VdsD_S0lCfP3D8idI8q4F6RnhoE