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: