2010-01-28 30 views
48

Lubię wtrysk oparty na konstruktorze, ponieważ pozwala mi on wstrzykiwać pola final. Lubię również wtrysk z adnotacją, ponieważ upraszcza mój context.xml. Mogę oznaczyć mojego konstruktora na @Autowired i wszystko działa dobrze, o ile nie mam dwóch parametrów tego samego typu. Na przykład, mam klasy:Sprężyna - wstrzyknij 2 fasole tego samego rodzaju.

@Component 
public class SomeClass { 
    @Autowired(required=true) 
    public SomeClass(OtherClass bean1, OtherClass bean2) { 
     … 
    } 
} 

i kontekst aplikacji z:

<bean id="bean1" class="OtherClass" /> 
<bean id="bean2" class="OtherClass" /> 

Nie powinno być jakiś sposób, aby określić identyfikator fasoli na konstruktora klasy SomeClass, ale mogę” • znaleźć go w dokumentacji. Czy to możliwe, czy też marzę o rozwiązaniu, które jeszcze nie istnieje?

Odpowiedz

72

@Autowired jest typu (w tym przypadku); używać @Qualifier do autowire według nazwy, idąc za przykładem from spring docs:

public SomeClass(
    @Qualifier("bean1") OtherClass bean1, 
    @Qualifier("bean2") OtherClass bean2) { 
    ... 
} 

Uwaga: W przeciwieństwie do @Autowired który znajduje zastosowanie do pól, konstruktorów i metod multi-argument (pozwalające na zwężenie poprzez adnotacje kwalifikacyjnych u poziom parametru) @Resource jest obsługiwany tylko dla pól i metod ustawiania właściwości komponentu bean z pojedynczym argumentem. W konsekwencji trzymaj się kwalifikatorów, jeśli twój cel wtryskowy jest konstruktorem lub metodą wielu argumentów.

(poniżej tekst jest pełny przykład)

+2

'@ Autowire' jest według nazwy też, ale w tym przypadku trzeba zapewnić ustawiające. Ale tutaj argumenty konstruktora są preferowane, a '@ Autowire' nie działa, jeśli oba argumenty są tego samego typu. Dlatego rzecz można rozwiązać za pomocą '@ Qualifier'. –

+0

wyjaśnił odpowiedź. – Bozho

+0

Zauważono ....... + 1 –

Powiązane problemy