2012-11-02 10 views
10

Mam Fasola:Dlaczego potrzebuję ustawiacza dla pola automatycznego/wtryskiwanego?

<bean id="BasketLogic" class="efco.logic.EfcoBasketLogic" autowire="byType"> 
     <property name="documentLogic" ref="DocumentLogic" /> 
     <property name="stateAccess" ref="StateAccess" /> 
     <property name="contextAccess" ref="ContextAccess" /> 
    </bean> 

    <bean id="EfcoErpService" autowire="byType" class="efco.erp.service.EfcoErpServiceImpl"> 
    <constructor-arg ref="ErpConnector"/> 
    </bean> 

documentLogic, stateAccess i contextAccess są pola na BasketLogicImpl

I nie mam <context:component-scan />

EfcoBasketLogic.java:

public class EfcoBasketLogic extends BasketLogicImpl { 

     @Inject 
     private EfcoErpService erpService; 
    ... 
    ... 
    ... 
} 

erpService to null, chyba że dostarczę setera. Ale dlaczego? Myślałem, że seter nie jest potrzebny tam, gdzie odbywa się autowiring? Czy to możliwe, że za to odpowiada BasketLogicImpl?

Odpowiedz

11

Konieczne jest użycie narzędzia ustawiającego, ponieważ adnotacje nie są wykrywane, chyba że zostanie to potwierdzone wiosną przez <context:component-scan /> lub <context:annotation-config />. Seter został wykryty, ponieważ podałeś autowire="byType".

Można znaleźć na to pytanie i odpowiedź jest pomocna także: When to use autowiring in Spring

+0

Jeśli to zrobię, pojawi się nowy problem -> _Nie zdefiniowano unikatowej fasoli typu [xyz]: oczekiwano pojedynczego pasującego komponentu bean, ale znaleziono 5_. Jest to spowodowane przez inny komponent bean, w którym jawnie wprowadzam właściwość za pomocą '', a 5 komponentów implementuje ten interfejs. Właściwość 'x' ma adnotację @Inject. Wydaje się więc, że jednoznaczne zdefiniowanie nie ma wpływu na rzeczy autoprzesyłane? – GarfieldKlon

+0

'@ Inject' zostanie rozwiązany poprawnie, jeśli istnieje tylko jeden komponent bean danego typu lub jeden oznaczony jako główny. Jeśli masz wiele wymiennych ziaren tego typu, musisz wprowadzić nazwę za pomocą '@ Resource' lub xml. – mrembisz

+0

Nawet jeśli wyraźnie wstrzyknę tę fasolę przez ''? – GarfieldKlon

1

Przede wszystkim, stosowanie <context:component-scan /> lub <context:annotation-config /> umożliwia Wiosna zeskanować kod za kwalifikujące fasola spotkać zależności, które w znacznym stopniu poprawić jego zdolność do podłącz je poprawnie, więc sugeruję dodanie ich do twojego pliku kontekstowego.

Po drugie, należy pamiętać, że @Inject jest adnotacją standardową (co oznacza specyfikację JSR-330). Można łączyć i dopasowywać adnotacje wiosenne do standardowych, ale zachowanie może się różnić w zależności od tego. @Named jest zwykle sparowany z @Inject w celu dopasowania komponentów do zależności (zarówno JSR-330). Szczegółowe informacje na ten temat można znaleźć w dokumencie reference. Informacje na temat sposobu użycia znajdują się w tabeli 4.6.

Ale aby bezpośrednio odpowiedzieć na pytanie: "dlaczego potrzebuję setera, gdy nie używam skanowania podzespołów", jest , ponieważ nie używasz skanowania podzespołów. Pytasz Spring, aby wstrzyknąć zależność "byType", ale nie pozwalając Springowi zeskanować twojego kodu dla komponentów, które są tego typu. Powód działania setera polega na tym, że typ wprowadzanego argumentu ustawiającego może zostać wykryty przez Spring w skompilowanym kodzie bajtowym (to znaczy meta-danych), a więc z powodzeniem rozwiązuje twoje żądanie.

+0

FYI: W przypadku użycia '', upewnij się, że ustawiłeś atrybut base-package w katalogu głównym twojej hierarchii klas, gdzie klasy bean są zadeklarowane (przez @Named lub @Aucowired). Na przykład: pmhargis

0

Rozumiem, że konfiguracja XML zastępuje konfigurację adnotacji. Fakt, że parametr autowire = "byType" nadpisuje automatyczny wtrysk, który szuka obecności metody ustawiającej dla wstrzyknięcia zależności.

Powiązane problemy