Funkcja automatycznego okablowania frameworka Spring umożliwia niejawne wstrzykiwanie zależności obiektu. Wewnętrznie używa wstrzykiwania settera lub konstruktora.
Nie można używać funkcji automatycznego okablowania do wstrzykiwania wartości pierwotnych i łańcuchowych. Działa tylko w celach referencyjnych.
Zaleta automatycznego okablowania
Wymaga mniej kodu ponieważ nie musimy pisać kodu, aby jawnie wstrzyknąć zależność.
Wady automatycznego okablowania
Brak kontroli programisty.
Nie można go używać do wartości pierwotnych i łańcuchowych.
Tryby automatycznego okablowania
Istnieje wiele trybów automatycznego okablowania:
wykres alokacji zasobów
NIE. | Tryb | Opis |
---|---|---|
1) | NIE | Jest to domyślny tryb automatycznego okablowania. Oznacza to, że domyślnie nie ma automatycznego okablowania. |
2) | wg nazwy | Tryb byName wstrzykuje zależność obiektu zgodnie z nazwą komponentu bean. W takim przypadku nazwa właściwości i nazwa komponentu bean muszą być takie same. Wewnętrznie wywołuje metodę ustawiającą. |
3) | według rodzaju | Tryb byType wprowadza zależność obiektu w zależności od typu. Zatem nazwa właściwości i nazwa komponentu bean mogą być różne. Wewnętrznie wywołuje metodę ustawiającą. |
4) | konstruktor | Tryb konstruktora wprowadza zależność poprzez wywołanie konstruktora klasy. Wywołuje konstruktor mający dużą liczbę parametrów. |
5) | automatyczne wykrywanie | Jest przestarzały od wiosny 3. |
Przykład automatycznego okablowania
Zobaczmy prosty kod umożliwiający użycie automatycznego okablowania na wiosnę. Aby zastosować tryby autowire, musisz użyć atrybutu autowire elementu bean.
Zobaczmy pełny przykład automatycznego okablowania na wiosnę. Aby utworzyć ten przykład, utworzyliśmy 4 pliki.
- B.java
- A.java
- aplikacjaContext.xml
- Test.java
Ta klasa zawiera tylko konstruktor i metodę.
package org.sssit; public class B { B(){System.out.println('b is created');} void print(){System.out.println('hello b');} }A.java
Ta klasa zawiera odwołanie do klasy B oraz konstruktora i metody.
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(); } }aplikacjaContext.xml
Test.java
Ta klasa pobiera komponent bean z pliku applicationContext.xml i wywołuje metodę display.
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(); } }
Wyjście:
b is created a is created hello a hello b
1) tryb automatycznego okablowania według nazwy
W przypadku trybu automatycznego okablowania według nazwy, identyfikator komponentu bean i nazwa referencyjna muszą być takie same.
Wewnętrznie wykorzystuje wtrysk setera.
nfa do dfa
Ale jeśli zmienisz nazwę komponentu bean, nie spowoduje to wstrzyknięcia zależności.
Zobaczmy kod, w którym zmieniamy nazwę komponentu bean z b na b1.
2) Tryb automatycznego okablowania według typu
W przypadku trybu automatycznego okablowania według typu, identyfikator komponentu bean i nazwa referencyjna mogą się różnić. Ale musi istnieć tylko jedna fasola danego typu.
Wewnętrznie wykorzystuje wtrysk setera.
W tym przypadku działa dobrze, ponieważ utworzyłeś instancję typu B. Nie ma znaczenia, że masz inną nazwę komponentu bean niż nazwa referencyjna.
Ale jeśli masz wiele komponentów bean jednego typu, nie zadziała i wyrzuci wyjątek.
Zobaczmy kod, w którym znajduje się wiele ziaren typu B.
W takim przypadku zgłosi wyjątek.
3) tryb automatycznego okablowania konstruktora
W przypadku trybu automatycznego okablowania konstruktora, kontener sprężynowy wprowadza zależność od najwyżej sparametryzowanego konstruktora.
Jeśli masz 3 konstruktory w klasie, zero-arg, jeden-arg i dwa-arg, wówczas zastrzyk zostanie wykonany poprzez wywołanie konstruktora z dwoma argumentami.
4) brak trybu automatycznego okablowania
W przypadku braku trybu automatycznego okablowania kontener sprężynowy nie wprowadza zależności poprzez automatyczne okablowanie.