Intro Inversio Ohjaus ja Riippuvuus Injektio Kevät

Intro Inversio Ohjaus ja Riippuvuus Injektio Kevät

Yleistä

tässä artikkelissa, me esitellä käsitteitä IoC (Inversion of Control) ja DI (Dependency Injection), ja me tulemme sitten katsomaan, miten nämä on toteutettu Spring framework.,

lisätietoa:

Johdotus Keväällä: @Autowired, @Resurssi-ja @Inject

Tämä artikkeli vertaa ja kontrasti käyttää merkintöjä, jotka liittyvät riippuvuus injektio, eli @Resurssi, @Pistää, ja @Autowired merkintöjä.
Lue lisää →

@Komponentti vs @Repository-ja @ – Palvelun Keväällä

Oppia eroja @Komponentti, @Repository-ja @ – Palvelu, huomautukset ja milloin käyttää niitä.
Lue lisää →

Mikä On Inversion of Control?,

Inversion of Control on periaate, software engineering, jonka ohjaus esineitä tai osia ohjelma siirretään astiaan tai framework. Sitä käytetään useimmiten olio-ohjelmoinnin yhteydessä.

toisin kuin perinteinen ohjelmointi, jossa meidän custom koodi tekee puhelut kirjasto, Kok mahdollistaa puitteet hallita virtaus ohjelma, ja soittaa meidän mukautetun koodin. Tämän mahdollistamiseksi frameworks käyttää abstraktioita, joihin on rakennettu lisäkäyttäytymistä., Jos haluamme lisätä omaa käyttäytymistämme, meidän on laajennettava puitteiden luokkia tai laajennettava omia luokkiamme.,

edut tämä arkkitehtuuri ovat:

  • tuotannosta tehtävän suorittamista sen toteuttaminen
  • jolloin se on helpompi vaihtaa eri toteutukset
  • suurempi modulaarisuus ohjelma
  • suurempi helppous testaus ohjelma eristämällä komponentti tai pilkaten sen riippuvuudet ja jonka avulla komponentit kommunikoivat sopimukset

Inversion of Control voidaan saavuttaa eri mekanismien kautta, kuten: Strategia-suunnittelumalli, Service Locator pattern, Tehtaan malli, ja Dependency Injection (DI).,

we ’ re going to look at DI next.

mikä on Huoltoruiske?

Riippuvuus injektio on malli, jonka kautta toteuttaa Kok, missä valvonta on ylösalaisin asetetaan objektin riippuvuuksia.

teko yhdistää esineitä muita esineitä, tai ”pistäminen” esineitä osaksi muita esineitä, on tehnyt kokoajan pikemminkin kuin esineitä itse.,

Tässä on, miten voit luoda objektin riippuvuutta perinteinen ohjelmointi:

public class Store { private Item item; public Store() { item = new ItemImpl1(); }}

yllä olevassa esimerkissä, meidän täytyy instanssia täytäntöönpanon Kohteen käyttöliittymä sisällä Myymälä luokan itse.

käyttämällä DI, voimme kirjoittaa esimerkiksi täsmentämättä täytäntöönpano Kohde, että haluamme:

public class Store { private Item item; public Store(Item item) { this.item = item; }}

seuraavissa kappaleissa, voimme nähdä, kuinka voimme tarjota täytäntöönpanon Kohteen metatietojen kautta.,

sekä Kok että DI ovat yksinkertaisia käsitteitä, mutta niillä on syviä vaikutuksia järjestelmiemme rakenteeseen, joten ne kannattaa ymmärtää hyvin.

Spring IoC-Säiliö

Kok kontti on yhteinen piirre kehyksiä, jotka toteuttaa IoC.

Keväällä framework, Kok kontti edustaa käyttöliittymä ApplicationContext. Keväällä säiliö on vastuussa instantiating, konfigurointi ja kokoonpano esineitä tunnetaan pavut, sekä hallita niiden elinkaaren ajan.,

Spring framework tarjoaa useita toteutuksia ApplicationContext — liitäntä- ClassPathXmlApplicationContext ja FileSystemXmlApplicationContext standalone sovelluksia, ja WebApplicationContext web-sovelluksia.

papujen kokoamiseksi säiliössä käytetään konfiguraatiometadataa, joka voi olla XML-konfiguraation tai-merkintöjen muodossa.

Tässä on yksi tapa manuaalisesti instanssia kontti:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

jos Haluat asettaa kohteen ominaisuus esimerkiksi edellä, voimme käyttää metatietoja., Sitten, säiliö lukee tämän metatiedon ja käyttää sitä koota pavut ajanhetkellä.

keväällä tehtävä Huoltoruiskutus voidaan tehdä rakentajien, settereiden tai kenttien kautta.

Rakentaja-Pohjainen Riippuvuus Injektio

tapauksessa rakentaja-pohjainen riippuvuus injektio säiliö vedota rakentajan argumentteja, joista kukin edustaa riippuvuus haluamme asettaa.

kevät ratkaisee jokaisen argumentin ensisijaisesti tyypeittäin, minkä jälkeen seuraa attribuutin nimi ja disambiguaatioindeksi., Katsotaanpa kokoonpano papu ja sen riippuvuudet käyttäen merkintöjä:

@Configuration-merkintä osoittaa, että luokka on lähde bean määritelmiä. Voimme myös lisätä sen useisiin asetusluokkiin.

@Bean-merkintää käytetään menetelmässä, jolla papu määritellään. Jos emme Määritä mukautetun nimen, bean nimi oletuksena menetelmän nimi.

Varten papu oletuksena singleton laajuus, Kevät tarkistaa ensin, jos välimuistissa esimerkiksi papu on jo olemassa ja luo uuden, jos sitä ei ole., Jos käytämme prototyypin scope, kontti palauttaa uuden papu-instanssin jokaiseen menetelmäkutsuun.

Toinen tapa luoda kokoonpano pavut on kautta XML kokoonpano:

Setteri-Pohjainen Riippuvuus Injektio

Varten setteri-pohjainen DI, säiliö soittaa setteri menetelmiä meidän luokan jälkeen vetoaminen ei ole argumentti rakentaja tai ei-argumentti staattinen tehdas menetelmä instantiate papu., Katsotaanpa luoda tämän kokoonpano käyttämällä merkintöjä:

@Beanpublic Store store() { Store store = new Store(); store.setItem(item1()); return store;}

voidaan käyttää myös XML sama kokoonpano pavut:

<bean class="org.baeldung.store.Store"> <property name="item" ref="item1" /></bean>

Rakentaja-pohjainen ja setter-pohjainen erilaisia injektio voidaan yhdistää saman bean. Kevätdokumentaatio suosittelee käyttämään constructor-pohjaista injektiota pakollisiin riippuvuuksiin ja setter-pohjaista injektiota valinnaisiin.

7., Kenttä-Pohjainen Riippuvuus Injektio

tapauksessa Kenttä-Pohjainen DI, voimme pistää riippuvuudet merkitsemällä ne, joilla on @Autowired merkintä:

public class Store { @Autowired private Item item; }

Kun rakentaa Myymälä, esine, jos ei ole rakentaja tai setteri menetelmä pistää Kohteen bean, säiliö on käyttää harkinta pistää Erä varastoon.

tähän päästään myös XML-konfiguraatiolla.,

Tämä lähestymistapa voisi näyttää yksinkertaisempi ja puhtaampi, mutta se ei ole suositeltavaa käyttää, koska se on muutamia haittoja, kuten:

  • Tämä menetelmä käyttää harkinta pistää riippuvuudet, joka on kalliimpi kuin rakentaja-pohjainen tai setteri-pohjainen injektio
  • Se on todella helppo pitää lisätä useita riippuvuuksia käyttämällä tätä lähestymistapaa. Jos käytit rakentaja injektio ottaa useita argumentteja olisi tehnyt meistä ajattelevat, että luokka tekee enemmän kuin yksi asia, joka voi rikkoa Yhden Vastuun Periaatetta.,

lisätietoja @Autowired merkintä löytyy Johdotus Keväällä artikkelissa.

Autowiring Riippuvuudet

Johdotus avulla Kevät kontti automaattisesti ratkaista riippuvuuksia välistä yhteistyötä pavut tarkastamalla pavut, jotka on määritelty.,

On olemassa neljä tilaa autowiring papu käyttäen XML kokoonpano:

  • no: default-arvo – tämä tarkoittaa, ettei autowiring käytetään papu ja meidän on nimenomaisesti nimi riippuvuudet
  • byName: autowiring on tehnyt nimen perusteella omaisuutta, siksi Kevät on etsiä papu, jolla on sama nimi kuin omaisuutta, joka on tarpeen asettaa
  • byType: samanlainen byName autowiring, vain perustuu tyyppi omaisuutta. Tämä tarkoittaa, että kevät etsii pavun, jossa on samantyyppinen ominaisuus asettaa., Jos tuollaisia papuja on enemmän kuin yksi, puitteet heittävät poikkeuksen.,voi myös pistää pavut käyttämällä @Autowired merkintä autowiring tyyppi:
    public class Store { @Autowired private Item item;}

    Jos siellä on enemmän kuin yksi papu samaa tyyppiä, voimme käyttää @Karsinnassa huomautusta viite papu nimi:

    public class Store { @Autowired @Qualifier("item1") private Item item;}

    Nyt, katsotaanpa autowire pavut tyypin kautta XML kokoonpano:

    <bean class="org.baeldung.store.Store" autowire="byType"> </bean>

    Seuraavaksi pistää bean nimeltä kohteen kohteen ominaisuus tallentaa bean nimen kautta XML:

    <bean class="org.baeldung.store.ItemImpl1" /><bean class="org.baeldung.store.Store" autowire="byName"></bean>

    – Meillä voi myös ohittaa autowiring määrittelemällä riippuvuudet eksplisiittisesti läpi konstruktorille argumentteja tai setters.,

    Laiska Alustettu Pavut

    oletuksena, säiliön luo ja määrittää kaikki singleton pavut alustuksen aikana. Voit välttää tämän, voit käyttää laiska-init-attribuutin arvo true bean kokoonpano:

    <bean class="org.baeldung.store.ItemImpl1" lazy-init="true" />

    tämän seurauksena kohde1 bean tulee olemaan alustettu vain silloin, kun se on ensin haettu, ja ei käynnistettäessä., Etuna tässä on nopeampi alustus aikaa, mutta kauppa-off on, että configuration virheet voidaan havaita vasta sen jälkeen, kun papu on pyydetty, joka voi olla useita tunteja tai jopa päiviä sen jälkeen, kun hakemus on jo ollut käynnissä.

    Johtopäätös

    tässä artikkelissa, olemme esitteli käsitteet inversio ohjaus ja riippuvuus injektio ja esimerkkinä ne Keväällä puitteissa.

    Voit lukea lisää näitä käsitteitä Martin Fowlerin artikkeleita:

    • Inversion of Control Säiliöt ja Riippuvuus Injektio kuvio.,
    • kontrollin kääntäminen

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *