Autowiring-funktionen i fjäderramverket gör att du kan injicera objektberoendet implicit. Den använder internt setter- eller konstruktorinjektion.
Autowiring kan inte användas för att injicera primitiva värden och strängvärden. Det fungerar endast med referens.
Fördel med Autowiring
Det kräver mindre kod eftersom vi inte behöver skriva koden för att injicera beroendet explicit.
Nackdelen med Autowiring
Ingen kontroll över programmeraren.
Det kan inte användas för primitiva värden och strängvärden.
Autowiring-lägen
Det finns många autokabellägen:
maven installera
Nej. | Läge | Beskrivning |
---|---|---|
1) | Nej | Det är standardläget för automatisk kabelkoppling. Det betyder ingen automatisk wiring som standard. |
2) | vid namn | ByName-läget injicerar objektberoendet enligt namnet på bönan. I sådana fall måste egenskapens namn och bönans namn vara samma. Det anropar internt setter-metoden. |
3) | efter typ | ByType-läget injicerar objektberoendet enligt typ. Så egenskapsnamn och bönnamn kan vara olika. Det anropar internt setter-metoden. |
4) | konstruktör | Konstruktorläget injicerar beroendet genom att anropa klassens konstruktor. Det anropar konstruktören som har ett stort antal parametrar. |
5) | automatiskt upptäcka | Den är utfasad sedan våren 3. |
Exempel på Autowiring
Låt oss se den enkla koden för att använda autowiring på våren. Du måste använda autowire-attributet för bönelementet för att tillämpa autowire-lägena.
Låt oss se det fullständiga exemplet på autowiring på våren. För att skapa detta exempel har vi skapat 4 filer.
- B.java
- A.java
- applicationContext.xml
- Test.java
Denna klass innehåller endast en konstruktor och metod.
package org.sssit; public class B { B(){System.out.println('b is created');} void print(){System.out.println('hello b');} }A.java
Denna klass innehåller referens till B-klass och konstruktor och metod.
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
Den här klassen hämtar bönan från filen applicationContext.xml och anropar 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-läge
I fallet med byName autowiring-läge måste bön-id och referensnamn vara samma.
Den använder internt setterinjektion.
sträng till json java
Men om du ändrar namnet på bönan kommer det inte att injicera beroendet.
Låt oss se koden där vi ändrar namnet på bönan från b till b1.
2) ByType autowiring-läge
I fallet med byType autowiring-läge kan bön-id och referensnamn vara olika. Men det måste bara finnas en böna av en typ.
Den använder internt setterinjektion.
I det här fallet fungerar det bra eftersom du har skapat en instans av B-typ. Det spelar ingen roll att du har ett annat bönnamn än referensnamn.
Men om du har flera bönor av en typ, kommer det inte att fungera och ger undantag.
Låt oss se koden där det finns många bönor av typ B.
I sådana fall kommer det att skapa undantag.
3) konstruktörs autokabelläge
I fallet med konstruktörs autokabelläge, injicerar fjäderbehållaren beroendet av den högsta parametriserade konstruktören.
Om du har 3 konstruktörer i en klass, noll-arg, en-arg och två-arg, kommer injektionen att utföras genom att anropa två-arg-konstruktorn.
4) inget autokabelläge
I händelse av inget autowiring-läge, injicerar fjäderbehållaren inte beroendet genom autowiring.