Tengo 2 beans que implementan una interfaz, por ejemplo un repositorio jpa con una base de datos y otro con archivos o en memoria, ponele... Y quiero algunas veces utilizar un bean y otras otro dependiendo de una configuración, esto se puede resolver de 2 maneras. Se puedes utilizar la anotación @Conditional o @Profile.
Veamos ejemplo utilizando profile:
public interface MyService {
void performService();
}
@Service
@Profile("serviceA")
public class ServiceA implements MyService {
@Override
public void performService() {
System.out.println("Service A implementation");
}
}
@Service
@Profile("serviceB")
public class ServiceB implements MyService {
@Override
public void performService() {
System.out.println("Service B implementation");
}
}
Tenemos que configurar el perfil activo en application.properties:
# Para usar ServiceA
spring.profiles.active=serviceA
# Para usar ServiceB
#spring.profiles.active=serviceB
Y inyectamos el bean:
@RestController
public class MyController {
private final MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/perform")
public String perform() {
myService.performService();
return "Service performed";
}
}
Y listo!!