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!!

