Autowiring-funktionen i fjederramme giver dig mulighed for implicit at injicere objektafhængigheden. Den bruger internt setter- eller konstruktørinjektion.
Autowiring kan ikke bruges til at injicere primitive værdier og strengværdier. Det virker kun med reference.
Fordel ved Autowiring
Det kræver mindre kode fordi vi ikke behøver at skrive koden for at injicere afhængigheden eksplicit.
Ulempen ved Autowiring
Ingen kontrol af programmør.
Det kan ikke bruges til primitive værdier og strengværdier.
Autowiring-tilstande
Der er mange autowiring-tilstande:
dynamisk programmering
Ingen. | Mode | Beskrivelse |
---|---|---|
1) | Ingen | Det er standardtilstanden for automatisk wiring. Det betyder ingen automatisk wiring som standard. |
2) | ved navn | ByName-tilstanden injicerer objektafhængigheden i henhold til navnet på bønnen. I sådanne tilfælde skal ejendomsnavnet og bønnenavnet være det samme. Det kalder internt setter-metoden. |
3) | efter type | ByType-tilstanden injicerer objektafhængigheden efter type. Så ejendomsnavn og bønnenavn kan være forskellige. Det kalder internt setter-metoden. |
4) | konstruktør | Konstruktørtilstanden injicerer afhængigheden ved at kalde klassens konstruktør. Det kalder konstruktøren med et stort antal parametre. |
5) | finde pr. automatik | Den er udfaset siden 3. forår. |
Eksempel på Autowiring
Lad os se den enkle kode til at bruge autowiring om foråret. Du skal bruge autowire-attributten for bønneelementet for at anvende autowire-tilstandene.
Lad os se det fulde eksempel på autowiring om foråret. For at lave dette eksempel har vi lavet 4 filer.
- B.java
- A.java
- applicationContext.xml
- Test.java
Denne klasse indeholder kun en konstruktør og metode.
package org.sssit; public class B { B(){System.out.println('b is created');} void print(){System.out.println('hello b');} }A.java
Denne klasse indeholder reference til B-klasse og konstruktør og metode.
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
Denne klasse henter bønnen fra filen applicationContext.xml og kalder visningsmetoden.
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(); } }
Produktion:
b is created a is created hello a hello b
1) ByName autowiring-tilstand
I tilfælde af byName autowiring-tilstand skal bean-id og referencenavn være det samme.
Den bruger internt setter-injektion.
listenode
Men hvis du ændrer navnet på bønnen, vil det ikke injicere afhængigheden.
Lad os se koden, hvor vi ændrer navnet på bønnen fra b til b1.
2) ByType autowiring-tilstand
I tilfælde af byType autowiring-tilstand kan bean-id og referencenavn være anderledes. Men der må kun være én bønne af en type.
Den bruger internt setter-injektion.
I dette tilfælde fungerer det fint, fordi du har oprettet en instans af B-type. Det gør ikke noget, at du har et andet bønnenavn end referencenavnet.
Men hvis du har flere bønner af en type, vil det ikke fungere og give undtagelser.
Lad os se koden, hvor der er mange bønner af type B.
I sådanne tilfælde vil det give undtagelse.
3) constructor autowiring mode
I tilfælde af autowiring-tilstand for konstruktør, indsprøjter fjederbeholderen afhængigheden af den højest parametriserede konstruktør.
Hvis du har 3 konstruktører i en klasse, zero-arg, one-arg og two-arg, vil injektionen blive udført ved at kalde to-arg konstruktøren.
4) ingen autowiring-tilstand
I tilfælde af ingen autowiring-tilstand injicerer fjederbeholderen ikke afhængigheden ved autowiring.