2012-11-21 6 views
9

Penso che il motivo principale per cui molti professionisti non passino all'iniezione delle dipendenze basata su annotazioni è che non supporta il passaggio tra ambienti di sviluppo/test/produzione. Per scopi di sviluppo, in molti casi non si utilizzano solo servizi diversi (e le relative connessioni), ma a volte è necessario prenderli in giro o creare istanze fittizie.Iniezione dipendenza basata sull'annotazione che gestisce ambienti diversi

Ieri ho capito una soluzione con annotazione Primavera:

@Value("#{${env} == "production" ? realService : dummyService}") 
    private SomeService service; 

... che dovrebbe funzionare, ma non è bello.

Sarei molto interessato alle vostre soluzioni o argomenti: perché non è un vero problema ;-) Guice, Spring, o qualsiasi altro sono i benvenuti.

Il problema originale era una parte di questo thread: Spring @Autowired usage, ma ho pensato che valesse la pena creare un nuovo thread.

risposta

9

Purtroppo non riesco a commentare Guice, ma come accennato nei commenti è possibile utilizzare i profili Spring, se si utilizza Spring 3.1 o versioni successive.

Un Java configurazione base che utilizzano profili potrebbe somigliare:

@Configuration 
@Profile("production") 
public class ProductionConfig { 
    @Bean 
    public SomeService someService() { ... } 
} 

@Configuration 
@Profile("dev") 
public class DevelopmentConfig { 
    @Bean 
    public SomeService someService() { ... } 
} 

Allora la vostra classe dei consumatori diventa quindi più semplice di nuovo:

... 
@Autowired 
private SomeService someService; 
... 

Il profilo desiderato può, tra le altre vie, attivabile attraverso una proprietà di sistema:

-Dspring.profiles.active="production" 

Quale può essere utile quando eseguendo la tua applicazione in diversi ambienti.

Personalmente cerco di non fare affidamento sui profili Spring. Invece, cerco di incapsulare le differenze ambientali nei file di proprietà esterni, che vengono passati all'applicazione in fase di runtime. Questo approccio ha funzionato bene finora ma ymmv.

-1

@Value l'annotazione non funziona come hai provato. Può solo darti dei valori in forma di stringa. Per quello che vuoi raggiungere puoi provare i Profili di Primavera come suggerito da @ShyJ.

Spero che questo ti aiuti. Saluti.