2013-10-27 17 views
8

To pytanie może wydawać się nieco dziwne. Załóżmy, że mam usługę, której chcę użyć w klasie Utility, która ma kilka statycznych metod. Usługa jest fasolą wiosenną, więc naturalnie wykorzystam na przykład settera i (@Aowiamizowane) do wstrzyknięcia go do mojej klasy narzędziowej. Jak wspomniano w dokumentacji Spring, wszystkie ziarna są statyczne w kontekście fasoli. Więc kiedy chcesz wstrzyknąć ziarno do klasy, nie musisz używać "statycznego" modyfikatora. Patrz poniżej:Jaki jest właściwy sposób użycia wstrzykniętego fasoli w metodzie statycznej?

 

public class JustAClass{ 
    private Service service; 

    public void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

Teraz wracając do tego, co już wspomniałem pierwsza (Używanie usług w statycznej metody):

 

public class JustAClass{ 
    private static Service service; 

    public static void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

choć obsługa jest statyczna, jestem zmuszony do wprowadzenia statycznego za jego definicji. Jest to dla mnie trochę sprzeczne z intuicją. czy to jest złe? czy jest to lepszy sposób? Dzięki

Odpowiedz

12

Nie można samodzielnie wyposażyć w pole statyczne.

Ale można zarobić trochę Obejście:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

    @PostConstruct 
    public void init() { 
    service = tmpService; 
    } 

} 

Uwaga, że ​​trzeba zadeklarować tę klasę jako „składnik” wstrzyknąć tmpService

+0

To jest ładne, działa na mnie! – Kaunteya

+0

Czy jest to coś, co byłoby regularnie wykonywane? Czy istnieje inne podejście zwykle stosowane w tych sytuacjach? –

3

Nie masz wyboru. Jeśli chcesz zainicjować pole klasy static, musisz pozwolić Springowi utworzyć instancję tej klasy i wprowadzić wartość.

Mała rada. Naprawdę nie ma żadnego powodu, aby używać metod static w tym przypadku. Jeśli chcesz użyć narzędzia singleton, po prostu ustaw zakres swojej fasoli na singleton.

Powiązane problemy