Jousikehyksen automaattinen johdotusominaisuus mahdollistaa objektiriippuvuuden lisäämisen implisiittisesti. Se käyttää sisäisesti setteri- tai konstruktoriinjektiota.
Automaattista johdotusta ei voida käyttää primitiivi- ja merkkijonoarvojen lisäämiseen. Se toimii vain viitteellä.
Autowiringin etu
Se vaatii vähemmän koodia koska meidän ei tarvitse kirjoittaa koodia lisätäksemme riippuvuuden nimenomaisesti.
Autowiringin haitta
Ei ohjelmoijan hallintaa.
Sitä ei voi käyttää primitiivi- ja merkkijonoarvoille.
Automaattiset johdotustilat
On olemassa monia automaattisia johdotustiloja:
taulukon pituus java
Ei. | tila | Kuvaus |
---|---|---|
1) | Ei | Se on oletusarvoinen automaattinen johdotustila. Se tarkoittaa, että oletuksena ei ole automaattista johdotusta. |
2) | nimeltä | ByName-tila lisää objektiriippuvuuden papun nimen mukaan. Tässä tapauksessa ominaisuuden nimen ja papun nimen on oltava sama. Se kutsuu sisäisesti setter-menetelmää. |
3) | Tyypin mukaan | ByType-tila lisää objektiriippuvuuden tyypin mukaan. Joten ominaisuuden nimi ja pavun nimi voivat olla erilaisia. Se kutsuu sisäisesti setter-menetelmää. |
4) | rakentaja | Konstruktoritila lisää riippuvuuden kutsumalla luokan rakentajaa. Se kutsuu konstruktoria, jolla on suuri määrä parametreja. |
5) | automaattinen havainnointi | Se on poistettu käytöstä keväästä 3 lähtien. |
Esimerkki automaattisesta kytkennästä
Katsotaanpa yksinkertainen koodi automaattisen johdotuksen käyttöön keväällä. Sinun on käytettävä bean-elementin autowire-attribuuttia käyttääksesi autowire-tiloja.
Katsotaanpa täydellinen esimerkki automaattisesta kytkennästä keväällä. Tämän esimerkin luomiseksi olemme luoneet 4 tiedostoa.
- B.java
- A.java
- applicationContext.xml
- Test.java
Tämä luokka sisältää vain konstruktorin ja metodin.
package org.sssit; public class B { B(){System.out.println('b is created');} void print(){System.out.println('hello b');} }A.java
Tämä luokka sisältää viittauksen B-luokkaan sekä konstruktoriin ja metodiin.
package org.sssit; public class A { B b; A(){System.out.println('a is created');} public B getB() { return b; } public void setB(B b) { this.b = b; } void print(){System.out.println('hello a');} void display(){ print(); b.print(); } }applicationContext.xml
Test.java
Tämä luokka saa papun applicationContext.xml-tiedostosta ja kutsuu näyttömenetelmää.
package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext('applicationContext.xml'); A a=context.getBean('a',A.class); a.display(); } }
Lähtö:
b is created a is created hello a hello b
1) byName automaattinen johdotustila
ByName-autojohdotustilassa paputunnuksen ja viitteen nimen on oltava samat.
Se käyttää sisäisesti setteriinjektiota.
Mutta jos muutat papun nimeä, se ei lisää riippuvuutta.
Katsotaanpa koodia, jossa muutamme papun nimen b:stä b1:ksi.
2) byType automaattinen johdotustila
ByType-automaattisessa johdotustilassa bean-tunnus ja viitenimi voivat olla erilaiset. Mutta tyyppiä saa olla vain yksi papu.
Se käyttää sisäisesti setteriinjektiota.
Tässä tapauksessa se toimii hyvin, koska olet luonut B-tyypin esiintymän. Ei ole väliä, että sinulla on eri papunimi kuin viitenimi.
Mutta jos sinulla on useita samantyyppisiä papuja, se ei toimi ja heittää poikkeuksen.
preg_match
Katsotaanpa koodia, jossa on monia B-tyypin papuja.
Siinä tapauksessa se tekee poikkeuksen.
3) rakentajan automaattinen johdotustila
Konstruktorin automaattisessa johdotustilassa jousisäiliö syöttää riippuvuuden korkeimman parametroidun konstruktorin mukaan.
Jos luokassa on 3 konstruktoria, zero-arg, one-arg ja two-arg, injektio suoritetaan kutsumalla kahden argin konstruktori.
4) ei automaattista johdotustilaa
Jos automaattijohdotusta ei ole, jousisäiliö ei lisää riippuvuutta automaattijohdotuksen avulla.