2012-11-06 10 views
8

So che non è un design migliore ma solo un pensiero da un principiante di primavera.Qual è il danno per rendere un metodo STATICO nel livello di servizio - Spring 3

Ora possiamo facilmente autowire qualsiasi metodo di servizio tra loro in modo conveniente nel framework Spring. Ma quale è lo svantaggio di creare un metodo factory statico della classe di servizio e chiamarlo ovunque?

E 'abbastanza comune in questo modo:

@Autowired 
CustomerService customerService; 

.... 
AccountDetail ad = customerService.getAccountDetail(accountId, type); 

Ma questo dovrebbe funzionare anche:

AccountDetail ad = CustomerService.getAccountDetail(accountId, type); //if we make getAccountDetail(String, String) static 

Allora, perché c'è un disegno simile autowire? Sembra elaborato e davvero interessante, ma il lavoro che sta dietro è ancora creare un'istanza di bean di servizio su un altro oggetto di servizio.

Seriamente mentre la primavera è in tutto il mercato, tanti post e articoli parlano di rinnovamenti &. Ma sta garantendo prestazioni migliori (come usare autowire invece di statico)?

+4

metodi statici uccidono il polimorfismo che rende difficile lo scambio/test/codice fittizio e ostacola l'innesto che sono i principi chiave della primavera –

risposta

13

Ci sono numerose ragioni:

  • non è possibile sostituire CustomerService con una finta facilmente durante le prove (strumenti come PowerMock parte)

  • static metodi non partecipano nella norma, basata su proxy AOP (nessuna transazione, sicurezza, aspetti personalizzati)

  • non è più possibile utilizzare tecniche di iniezione di fantasia, come iniettare la richiesta HTTP (richiesta scope) in servizi con ambito singleton (Cattiva progettazione in ogni caso, ma ...)

Ma per essere completo, ci sono anche dei vantaggi:

  • static metodo è in realtà più vicino al vostro intento, fagioli primavera sono molto raramente stateful, quindi non hanno davvero bisogno di un esempio per lavorare

  • static chiamata potrebbe essere più veloce (questo è irrilevante nel 99% dei programmi)

4

E se fosse necessario disporre di più componenti CustomerService con configurazione diversa? Non puoi farlo con un singolo metodo statico.

Inoltre, se c'è qualche configurazione su CustomerService, come si fa a iniettarlo? Avere un bean che viene cablato in oggetti dipendenti centralizza la tua configurazione e ti impedisce di dover cercare attraverso il tuo codice.

Problemi correlati