2013-10-27 3 views
8

Diese Frage mag ein wenig seltsam erscheinen. Angenommen, ich habe einen Dienst, den ich in einer Utility-Klasse mit statischen Methoden verwenden möchte. Der Dienst ist eine Spring-Bean, also werde ich zum Beispiel natürlich einen Setter benutzen und (@Autowired), um es in meine Utility-Klasse zu injizieren. Wie in der Dokumentation von Spring erwähnt, sind alle Beans im Bean-Kontext statisch. Wenn Sie also eine Bean in eine Klasse injizieren möchten, müssen Sie den Modifikator "static" nicht verwenden. Siehe unten:Was ist der richtige Weg, eine injizierte Bean in einer statischen Methode zu verwenden?

 

public class JustAClass{ 
    private Service service; 

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

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

} 
 

Jetzt geht zurück zu dem, was ich erwähnte erstes (mit dem Service in einer statischen Methode):

 

public class JustAClass{ 
    private static Service service; 

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

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

} 
 

Obwohl Dienst statisch ist, bin ich gezwungen, hinter seiner Definition statisch zu setzen. Das ist für mich etwas kontraintuitiv. ist das falsch? oder ist es ein besserer Weg? Danke

Antwort

12

Sie können das statische Feld nicht automatisch ansteuern.

Aber man kann ein wenig Abhilfe machen:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

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

} 

Beachten Sie, dass Sie diese Klasse als „Komponente“ erklären, müssen zu injizieren tmpService

+0

Dieses schöne ist, funktioniert für mich! – Kaunteya

+0

Wird das regelmäßig gemacht? Oder wird in diesen Situationen üblicherweise anders vorgegangen? –

3

Sie haben keine Wahl. Wenn Sie ein static-Feld einer Klasse initialisieren möchten, müssen Sie Spring eine Instanz dieser Klasse erstellen lassen und den Wert injizieren.

Ein kleiner Tipp. Es gibt wirklich keinen Grund für Sie, static Methoden in diesem Fall zu verwenden. Wenn Sie ein Singleton-Dienstprogramm verwenden möchten, müssen Sie nur Ihre Bean singleton Bereich haben.

Verwandte Themen