Cablaggio a molla condizionale a un ambiente

Con il cablaggio Spring, se ho più implementazioni di un’interfaccia, posso usare @Qualifier per specificare quale voglio.

Ad esempio, supponendo che io abbia un

@Component @Qualifier("Toyota") public class Toyota implements Car 

e a

 @Component @Qualifier("Bmv") public class Bmv implements Car 

Quindi posso selezionare un’implementazione specifica con:

  @Qualifier("Toyota") Car car 

Ma c’è un modo per selezionare l’implementazione basata su un ambiente?

Vale a dire se ho spring.profiles.active impostato su local, quindi selezionerò l’implementazione “Toyota” di Car, ma se spring.profiles.active è impostato su dev o stage, quindi selezionerò l’implementazione “Bmv” di Car ?

Un esempio della syntax esatta sarebbe apprezzato.

Ah, la soluzione è in realtà abbastanza semplice:

 @Component @Qualifier("Bmv") @Profile("!dev") public class Bmv implements Car 

e

 @Component @Qualifier("Toyota") @Profile("dev") public class Toyota implements Car 

In questo modo, il cablaggio di Car utilizzerà Toyota per l’ambiente di sviluppo e Bmv altrimenti.

È ansible eseguire l’iniezione di entrambe le implementazioni e scegliere quale è necessario per parametro {spring.profiles.active}, come questo codice:

 @autowired private Car Toyota; @autowired private Car Bmv; public Car getCar(){ if(spring.profiles.active is local){ return Toyota; }else{ return bmv; } } 

Spring 3.1 ha introdotto i profili dell’ambiente: http://blog.springsource.com/2011/02/11/spring-framework-3-1-m1-released/

Personalmente non mi piacciono i qualificatori e usarli nel modo in cui hai proposto il codice si accoppia effettivamente all’attuazione piuttosto che al disaccoppiamento. Puoi utilizzare l’elemento @Autowired come proposto da Jason, ma accoppialo con i profili bean in questo modo:

e quindi quando crei l’ambiente, specifichi un profilo:

dispatcher org.springframework.web.servlet.DispatcherServlet spring.profiles.active production