java - dependencias - Inyección de dependencia guiada por anotación que maneja diferentes entornos
inyeccion de dependencias android (2)
Creo que la razón principal por la que muchos profesionales no cambian a la inyección de dependencias impulsada por anotaciones es porque no admite el cambio entre entornos de desarrollo / prueba / producción. Para fines de desarrollo, en muchos casos, no solo utiliza diferentes servicios (y conexiones para ellos), sino que a veces necesita simularlos o crear instancias ficticias.
Ayer descubrí una solución con la anotación de Spring:
@Value("#{${env} == "production" ? realService : dummyService}")
private SomeService service;
... que debería funcionar, pero no agradable.
Me interesarían mucho sus soluciones o argumentos: ¿por qué no es un problema real ?-) Guice, Spring o cualquier otro son bienvenidos.
El problema original era una parte de este hilo: Spring @Autowired usage , pero pensé que valía la pena crear un nuevo hilo.
Desafortunadamente no puedo comentar sobre Guice, pero como se menciona en los comentarios, puedes usar los perfiles de Spring, si estás usando Spring 3.1 o una versión posterior.
Una configuración basada en Java que utiliza perfiles podría tener el siguiente aspecto:
@Configuration
@Profile("production")
public class ProductionConfig {
@Bean
public SomeService someService() { ... }
}
@Configuration
@Profile("dev")
public class DevelopmentConfig {
@Bean
public SomeService someService() { ... }
}
Entonces su clase de consumo se vuelve más simple de nuevo:
...
@Autowired
private SomeService someService;
...
El perfil deseado puede, entre otras formas, ser activado a través de una propiedad del sistema:
-Dspring.profiles.active="production"
Lo cual puede ser útil al ejecutar su aplicación en diferentes entornos.
Personalmente trato de no confiar en los perfiles de Spring en absoluto. En cambio, trato de encapsular las diferencias ambientales en los archivos de propiedades externas, que se pasan a la aplicación en tiempo de ejecución. Este enfoque ha funcionado bien hasta el momento, pero mmm.
@Value
anotación @Value
no funciona de la manera que lo ha intentado. Solo puede darte valores en forma de String. Para lo que quiere lograr, puede probar Spring Profiles según lo sugerido por @ShyJ.
Espero que esto te ayude. Aclamaciones.