2012-08-02 14 views
16

Powiedz, że muszę polegać na kilku implementacjach z komponentu Spring bean. Mam jeden interfejs AccountService i dwie implementacje: DefaultAccountServiceImpl i SpecializedAccountServiceImpl.Obsługa kilku implementacji jednej fasoli sprężystej/interfejsu

  1. Jak to jest możliwe (wstrzyknięcie jednej lub drugiej realizacji) na wiosnę?

  2. Która z poniższych implementacji wtrysku?

    @Autowired 
    private AccountService accountService; 
    

Odpowiedz

17

reklam. 1: możesz użyć @Qualifier annotation lub autowire używając @Resource w przeciwieństwie do , która domyślnie jest nazwą pola zamiast typu.

Ad. 2: W czasie wykonywania nie powiedzie się, że dwa komponenty obsługują ten interfejs. Jeśli jedna z twoich ziaren jest dodatkowo annotated with @Primary, będzie preferowana podczas autowiring według typu.

+0

Tomasz: Rozumiem, że muszę użyć '@Qualifier (" specjalistyczne ")', aby określić implementację, która ma zostać wstrzyknięta. Następnie, jeśli zdefiniuję moją usługę przy użyciu java (zamiast xml), w jaki sposób określić, który kwalifikator ma? Czy to zrobi: '@Service (" specjalistyczne ")'? – balteo

+2

@balteo: tak. Albo przypisz nazwę usługi ręcznie w adnotacji '@ Service' lub przyjmij prostą nazwę klasy z pierwszym znakiem małej litery:' @Qualifier ("specializedAccountServiceImpl") '. –

13
@Autowired 
@Qualifier("impl1") 
BaseInterface impl1; 

@Autowired 
@Qualifier("impl2") 
BaseInterface impl2; 

@Component(value="impl1") 
public class Implementation1 implements BaseInterface { 

} 

@Component(value = "impl2") 
public class Implementation2 implements BaseInterface { 

} 


For full code: https://github.com/rsingla/springautowire/ 
+1

Co jeśli chcę zmienić implementację we wszystkich miejscach, w których @ @ Zapamiętaj interfejs? Nie chcę określać jawnie we wszystkich miejscach użytkowania. –

+1

Możesz użyć wyrażenia Spring za pomocą wartości @, a następnie wstaw wartość do pliku właściwości (application.properties) i przełączaj kwantyfikatory bean bean w tę iz powrotem. (Nie próbowałem tego w tym konkretnym przypadku, ale jestem pewien, że jest to tylko ciąg znaków, który zajmuje adnotacja, więc powinien działać poprawnie. –

+0

Dobrze, dzięki za cenne :) rozwiązanie –

Powiązane problemy