2013-10-27 11 views
8

Questa domanda potrebbe sembrare un po 'strana. Supponiamo che abbia un servizio che voglio usare in una classe di utilità che ha alcuni metodi statici. Il servizio è un bean Spring, quindi naturalmente userò un setter e (@Autowired) per iniettarlo nella mia classe di utilità. Come menzionato nella documentazione di Spring, tutti i bean sono statici nel contesto bean. Quindi, quando vuoi iniettare un bean in una classe, non devi usare il modificatore "statico". Vedere di seguito:Qual è il modo corretto di utilizzare un bean iniettato in un metodo statico?

 

public class JustAClass{ 
    private Service service; 

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

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

} 
 

Ora tornare a quello che ho detto prima (Uso del servizio in un metodo statico):

 

public class JustAClass{ 
    private static Service service; 

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

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

} 
 

anche se il servizio è statico, sono costretto a mettere statica dietro la sua definizione. Questo è un po 'contro-intuitivo per me. è sbagliato? o è un modo migliore? Grazie

risposta

12

Non è possibile autorizzare il campo statico.

Ma si può fare un po 'di soluzione:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

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

} 

nota, che si deve dichiarare questa classe come "Componente" per iniettare tmpService

+0

Questo è bello, lavora per me! – Kaunteya

+0

È qualcosa che sarebbe fatto regolarmente? O c'è un approccio diverso di solito usato in queste situazioni? –

3

Non hai scelta. Se si desidera inizializzare un campo static di una classe, è necessario consentire a Spring di creare un'istanza di tale classe e iniettare il valore.

Un piccolo consiglio. In questo caso, non esiste alcun motivo per cui si utilizzino i metodi static. Se vuoi un'utilità singleton, fai in modo che il bean abbia lo scope singleton.

Problemi correlati